var app5=new Vue({el:'#app-5',data:{message:'Hello Vue.js!'},methods:{reverseMessage:function(){this.message=this.message.split('').reverse().join('')}}})
整个 page 加载完成后 , ECE 开始运行 , 读取 run
内的文字$('run').text()
, 得到代码块 , 通过 eval
执行 , 更新{{message}}
, 并绑定 Vue 函数 , 实现按钮功能 。
前边儿我说过 , 普通的博客文章是没法做到这样真正使用 Vue.js 实现的交互效果 。 如果不用别的招 , 它们只能干瘪地罗列一堆代码 , 读者看了半天也是满头雾水 , 依然不知道这玩意儿到底是个什么样 。 有心的读者也许会按图索骥 , 摸到官网去看文档和交互演示 , 心中满是问号: 为什么不从一开始就直接看官网 。 而意志薄弱的哥们儿 , 可能就此放弃阅读 , 关掉网页 , 顺便再骂上一句: 辣鸡 。
如果改成使用内嵌代码块这种 methodology 就能完美解决 。 比如上面的例子 , 只需要在文章正文写上 HTML 代码:
<div id ="app-5" >
<p > {{ message }}</p >
<button v-on:click ="reverseMessage" > 逆转消息</button >
</div >
然后把 Vue 代码写到一个 run
标签里
<run >
var app5 = new Vue({
el: '#app-5',
data: {
message: 'Hello Vue.js!'
},
methods: {
reverseMessage: function() {
this.message = this.message.split('').reverse().join('')
}
}
})
</run >
ECE 的实现很简单 , 它分为标准执行阶段 ( runearly
) 和推迟执行阶段 ( run
) 。 标准执行阶段的代码块是在 DOM 树加载完即就开始执行 , 相当于:
$(function ( ) {
});
推迟执行阶段的代码则需要等到文档全部载入后才执行 , 相当于:
$(window ).load (function ( ) {
});
这很好理解 , 如果想不明白 , 看看我前面提到的那篇文章 。
多个代码块之间传递变量
ECE 是用 eval
执行代码的 , 这带来一个问题: 多个 run
代码块之间没法直接传递变量 。 比如我写:
<run >
var a = 1;
</run >
<run >
a = a + 1;
</run >
第二个 run
是没法执行的 , 浏览器会报错:
ReferenceError: a is not defined
a
的生命周期只限于第一个 run
内 。 为了解决这个问题 , 我在全局设置 里增加了一个数组型的 variable bank 和三个助手函数 , 分别用来读取/ 写入/ 删除需要共享的变量:
var bank = new Array ();
function getValue (key ) {
return bank[key];
}
function setValue (key, value ) {
bank[key] = value;
}
function removeValue (key ) {
bank.remove (key);
}
bank
的生命周期是整个 session 。 通过它 , 各个代码块之间可以互相传递变量 。 上面的那俩稍微修改一下就能正常工作:
<run >
setValue("a", 1);
</run >
<run >
setValue("a", getValue("a") + 1);
</run >
当然 , 变量定义的先后顺序还是需要你来保障的 。 这样一来 , 你在写文章尤其是长文章时就能把代码块分开写在文章不同的位置 , 而不用把所有的代码都挤在一个 run
里 , 影响写作思路 。
要注意 , 代码块里定义的函数也受到生命周期的影响 , 你得把函数也缓存起来 。
另外一种变量传递解决方案是使用 cookie 完成 。 Cookie 优点在于可以在不同页面间传递值 , 这一点上面的方案是办不到的 。 但是它的缺点也和优点一样明显 。 Cookie 没办法直接保存除了字符串和数字之外的变量 , 比如数组 、 函数 。 好在大部分网页内容和变量都可以通过序列化 转换成 JSON 字符串进行保存/ 读取 。 Cookie 的操作可以借用 js-cookie 完成 , 非常方便 。
其他的骚操作
有了运行代码块的能力 , 你可以在讲解 Vue 的时候 , 引入其他的内容配合讲解 。 比如绘制精美的交互式图表 , 再搭配 Vue 的动态绑定 、 插槽等等特性 , 写一篇图文并茂的文章 , 自然完爆那些用着默认主题 , 呆板 、 无神的鸡肋文 。
正在画图…
▲ 演示
function paintCanvas(canvas){var myChart=echarts.init(document.getElementById(canvas));myChart.showLoading();var json_data={"name":"flare","children":[{"name":"analytics","children":[{"name":"cluster","children":[{"name":"AgglomerativeCluster","value":3938},{"name":"CommunityStructure","value":3812},{"name":"HierarchicalCluster","value":6714},{"name":"MergeEdge","value":743}]},{"name":"graph","children":[{"name":"BetweennessCentrality","value":3534},{"name":"LinkDistance","value":5731},{"name":"MaxFlowMinCut","value":7840},{"name":"ShortestPaths","value":5914},{"name":"SpanningTree","value":3416}]},{"name":"optimization","children":[{"name":"AspectRatioBanker","value":7074}]}]},{"name":"animate","children":[{"name":"Easing","value":17010},{"name":"FunctionSequence","value":5842},{"name":"interpolate","children":[{"name":"ArrayInterpolator","value":1983},{"name":"ColorInterpolator","value":2047},{"name":"DateInterpolator","value":1375},{"name":"Interpolator","value":8746},{"name":"MatrixInterpolator","value":2202},{"name":"NumberInterpolator","value":1382},{"name":"ObjectInterpolator","value":1629},{"name":"PointInterpolator","value":1675},{"name":"RectangleInterpolator","value":2042}]},{"name":"ISchedulable","value":1041},{"name":"Parallel","value":5176},{"name":"Pause","value":449},{"name":"Scheduler","value":5593},{"name":"Sequence","value":5534},{"name":"Transition","value":9201},{"name":"Transitioner","value":19975},{"name":"TransitionEvent","value":1116},{"name":"Tween","value":6006}]},{"name":"data","children":[{"name":"converters","children":[{"name":"Converters","value":721},{"name":"DelimitedTextConverter","value":4294},{"name":"GraphMLConverter","value":9800},{"name":"IDataConverter","value":1314},{"name":"JSONConverter","value":2220}]},{"name":"DataField","value":1759},{"name":"DataSchema","value":2165},{"name":"DataSet","value":586},{"name":"DataSource","value":3331},{"name":"DataTable","value":772},{"name":"DataUtil","value":3322}]},{"name":"display","children":[{"name":"DirtySprite","value":8833},{"name":"LineSprite","value":1732},{"name":"RectSprite","value":3623},{"name":"TextSprite","value":10066}]},{"name":"flex","children":[{"name":"FlareVis","value":4116}]},{"name":"physics","children":[{"name":"DragForce","value":1082},{"name":"GravityForce","value":1336},{"name":"IForce","value":319},{"name":"NBodyForce","value":10498},{"name":"Particle","value":2822},{"name":"Simulation","value":9983},{"name":"Spring","value":2213},{"name":"SpringForce","value":1681}]},{"name":"query","children":[{"name":"AggregateExpression","value":1616},{"name":"And","value":1027},{"name":"Arithmetic","value":3891},{"name":"Average","value":891},{"name":"BinaryExpression","value":2893},{"name":"Comparison","value":5103},{"name":"CompositeExpression","value":3677},{"name":"Count","value":781},{"name":"DateUtil","value":4141},{"name":"Distinct","value":933},{"name":"Expression","value":5130},{"name":"ExpressionIterator","value":3617},{"name":"Fn","value":3240},{"name":"If","value":2732},{"name":"IsA","value":2039},{"name":"Literal","value":1214},{"name":"Match","value":3748},{"name":"Maximum","value":843},{"name":"methods","children":[{"name":"add","value":593},{"name":"and","value":330},{"name":"average","value":287},{"name":"count","value":277},{"name":"distinct","value":292},{"name":"div","value":595},{"name":"eq","value":594},{"name":"fn","value":460},{"name":"gt","value":603},{"name":"gte","value":625},{"name":"iff","value":748},{"name":"isa","value":461},{"name":"lt","value":597},{"name":"lte","value":619},{"name":"max","value":283},{"name":"min","value":283},{"name":"mod","value":591},{"name":"mul","value":603},{"name":"neq","value":599},{"name":"not","value":386},{"name":"or","value":323},{"name":"orderby","value":307},{"name":"range","value":772},{"name":"select","value":296},{"name":"stddev","value":363},{"name":"sub","value":600},{"name":"sum","value":280},{"name":"update","value":307},{"name":"variance","value":335},{"name":"where","value":299},{"name":"xor","value":354},{"name":"-","value":264}]},{"name":"Minimum","value":843},{"name":"Not","value":1554},{"name":"Or","value":970},{"name":"Query","value":13896},{"name":"Range","value":1594},{"name":"StringUtil","value":4130},{"name":"Sum","value":791},{"name":"Variable","value":1124},{"name":"Variance","value":1876},{"name":"Xor","value":1101}]},{"name":"scale","children":[{"name":"IScaleMap","value":2105},{"name":"LinearScale","value":1316},{"name":"LogScale","value":3151},{"name":"OrdinalScale","value":3770},{"name":"QuantileScale","value":2435},{"name":"QuantitativeScale","value":4839},{"name":"RootScale","value":1756},{"name":"Scale","value":4268},{"name":"ScaleType","value":1821},{"name":"TimeScale","value":5833}]},{"name":"util","children":[{"name":"Arrays","value":8258},{"name":"Colors","value":10001},{"name":"Dates","value":8217},{"name":"Displays","value":12555},{"name":"Filter","value":2324},{"name":"Geometry","value":10993},{"name":"heap","children":[{"name":"FibonacciHeap","value":9354},{"name":"HeapNode","value":1233}]},{"name":"IEvaluable","value":335},{"name":"IPredicate","value":383},{"name":"IValueProxy","value":874},{"name":"math","children":[{"name":"DenseMatrix","value":3165},{"name":"IMatrix","value":2815},{"name":"SparseMatrix","value":3366}]},{"name":"Maths","value":17705},{"name":"Orientation","value":1486},{"name":"palette","children":[{"name":"ColorPalette","value":6367},{"name":"Palette","value":1229},{"name":"ShapePalette","value":2059},{"name":"SizePalette","value":2291}]},{"name":"Property","value":5559},{"name":"Shapes","value":19118},{"name":"Sort","value":6887},{"name":"Stats","value":6557},{"name":"Strings","value":22026}]},{"name":"vis","children":[{"name":"axis","children":[{"name":"Axes","value":1302},{"name":"Axis","value":24593},{"name":"AxisGridLine","value":652},{"name":"AxisLabel","value":636},{"name":"CartesianAxes","value":6703}]},{"name":"controls","children":[{"name":"AnchorControl","value":2138},{"name":"ClickControl","value":3824},{"name":"Control","value":1353},{"name":"ControlList","value":4665},{"name":"DragControl","value":2649},{"name":"ExpandControl","value":2832},{"name":"HoverControl","value":4896},{"name":"IControl","value":763},{"name":"PanZoomControl","value":5222},{"name":"SelectionControl","value":7862},{"name":"TooltipControl","value":8435}]},{"name":"data","children":[{"name":"Data","value":20544},{"name":"DataList","value":19788},{"name":"DataSprite","value":10349},{"name":"EdgeSprite","value":3301},{"name":"NodeSprite","value":19382},{"name":"render","children":[{"name":"ArrowType","value":698},{"name":"EdgeRenderer","value":5569},{"name":"IRenderer","value":353},{"name":"ShapeRenderer","value":2247}]},{"name":"ScaleBinding","value":11275},{"name":"Tree","value":7147},{"name":"TreeBuilder","value":9930}]},{"name":"events","children":[{"name":"DataEvent","value":2313},{"name":"SelectionEvent","value":1880},{"name":"TooltipEvent","value":1701},{"name":"VisualizationEvent","value":1117}]},{"name":"legend","children":[{"name":"Legend","value":20859},{"name":"LegendItem","value":4614},{"name":"LegendRange","value":10530}]},{"name":"operator","children":[{"name":"distortion","children":[{"name":"BifocalDistortion","value":4461},{"name":"Distortion","value":6314},{"name":"FisheyeDistortion","value":3444}]},{"name":"encoder","children":[{"name":"ColorEncoder","value":3179},{"name":"Encoder","value":4060},{"name":"PropertyEncoder","value":4138},{"name":"ShapeEncoder","value":1690},{"name":"SizeEncoder","value":1830}]},{"name":"filter","children":[{"name":"FisheyeTreeFilter","value":5219},{"name":"GraphDistanceFilter","value":3165},{"name":"VisibilityFilter","value":3509}]},{"name":"IOperator","value":1286},{"name":"label","children":[{"name":"Labeler","value":9956},{"name":"RadialLabeler","value":3899},{"name":"StackedAreaLabeler","value":3202}]},{"name":"layout","children":[{"name":"AxisLayout","value":6725},{"name":"BundledEdgeRouter","value":3727},{"name":"CircleLayout","value":9317},{"name":"CirclePackingLayout","value":12003},{"name":"DendrogramLayout","value":4853},{"name":"ForceDirectedLayout","value":8411},{"name":"IcicleTreeLayout","value":4864},{"name":"IndentedTreeLayout","value":3174},{"name":"Layout","value":7881},{"name":"NodeLinkTreeLayout","value":12870},{"name":"PieLayout","value":2728},{"name":"RadialTreeLayout","value":12348},{"name":"RandomLayout","value":870},{"name":"StackedAreaLayout","value":9121},{"name":"TreeMapLayout","value":9191}]},{"name":"Operator","value":2490},{"name":"OperatorList","value":5248},{"name":"OperatorSequence","value":4190},{"name":"OperatorSwitch","value":2581},{"name":"SortOperator","value":2023}]},{"name":"Visualization","value":16540}]}]};myChart.hideLoading();myChart.setOption(option={tooltip:{trigger:'item',triggerOn:'mousemove'},series:[{type:'tree',data:[json_data],top:'18%',bottom:'14%',layout:'radial',symbol:'emptyCircle',symbolSize:7,initialTreeDepth:3,animationDurationUpdate:750}]})}paintCanvas('chart1');
或者做点小小的统计:
正在画图…
▲ 演示
function getVirtulData(year) {
year = year || '2019';
var date = +echarts.number.parseDate(year + '-01-01');
var end = +echarts.number.parseDate((+year + 1) + '-01-01');
var dayTime = 3600 * 24 * 1000;
var data = [];
for (var time = date; time < end; time += dayTime) {
data.push([
echarts.format.formatTime('yyyy-MM-dd', time),
Math.floor(Math.random() * 10000)
]);
}
return data;
}
function paintCanvas(canvas) {
var myChart = echarts.init(document.getElementById(canvas));
myChart.showLoading();
var data = getVirtulData(2018);
option = {
backgroundColor: '#f5f5f5',
title: {
top: 30,
text: '2018 年我每天的开销 ',
subtext: '数据纯属虚构',
left: 'center',
textStyle: {
color: '#333'
}
},
tooltip: {
trigger: 'item'
},
legend: {
top: '30',
left: '100',
data: ['金额', 'Top 10'],
textStyle: {
color: '#333'
}
},
calendar: [{
top: 100,
left: 'center',
range: ['2018-01-01', '2018-06-30'],
splitLine: {
show: true,
lineStyle: {
color: '#000',
width: 4,
type: 'solid'
}
},
yearLabel: {
formatter: '{start} 上半年 ',
textStyle: {
color: '#333'
}
},
itemStyle: {
normal: {
color: '#323c48',
borderWidth: 1,
borderColor: '#111'
}
}
}, {
top: 300,
left: 'center',
range: ['2018-07-01', '2018-12-31'],
splitLine: {
show: true,
lineStyle: {
color: '#000',
width: 4,
type: 'solid'
}
},
yearLabel: {
formatter: '{start} 下半年 ',
textStyle: {
color: '#333'
}
},
itemStyle: {
normal: {
color: '#323c48',
borderWidth: 1,
borderColor: '#111'
}
}
}],
series: [{
name: '金额',
type: 'scatter',
coordinateSystem: 'calendar',
data: data,
symbolSize: function (val) {
return val[1] / 500;
},
itemStyle: {
normal: {
color: '#ddb926'
}
}
}, {
name: '金额',
type: 'scatter',
coordinateSystem: 'calendar',
calendarIndex: 1,
data: data,
symbolSize: function (val) {
return val[1] / 500;
},
itemStyle: {
normal: {
color: '#ddb926'
}
}
}, {
name: 'Top 10',
type: 'effectScatter',
coordinateSystem: 'calendar',
calendarIndex: 1,
data: data.sort(function (a, b) {
return b[1] - a[1];
}).slice(0, 10),
symbolSize: function (val) {
return val[1] / 500;
},
showEffectOn: 'render',
rippleEffect: {
brushType: 'stroke'
},
hoverAnimation: true,
itemStyle: {
normal: {
color: '#f4e925',
shadowBlur: 10,
shadowColor: '#333'
}
},
zlevel: 1
}, {
name: 'Top 10',
type: 'effectScatter',
coordinateSystem: 'calendar',
data: data.sort(function (a, b) {
return b[1] - a[1];
}).slice(0, 10),
symbolSize: function (val) {
return val[1] / 500;
},
showEffectOn: 'render',
rippleEffect: {
brushType: 'stroke'
},
hoverAnimation: true,
itemStyle: {
normal: {
color: '#f4e925',
shadowBlur: 10,
shadowColor: '#333'
}
},
zlevel: 1
}]
};
myChart.hideLoading();
myChart.setOption(option);
}
paintCanvas('chart2');
反正都是刷刷存在感 , 为什么不用你脑中那些乱七八糟的 JS 知识 , 让你的文章更骚一点? 你说呢 , 秀儿?
本该耀眼的文章 , 你怎么好意思让它丑陋不堪 , 寡淡无味 , 泯然于众? !
The End. □ ◻
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?