学习笔记:mpvue开发小程序——入门
<p>接下来可能要开发一个小程序,同事推荐使用mpvue,那么我提前熟悉下。</p><p> </p>
<p>官网地址:http://mpvue.com/</p>
<p> </p>
<h3>1.快速上手 http://mpvue.com/mpvue/quickstart/</h3>
<p>跟着官网提示走,搭建一个mpvue的小程序项目</p>
<p>注意,这里我用yarn代替了npm才安装成功。</p>
<p> </p>
<h3>2.分包机制</h3>
<p>mpvue-loader 1.1.2-rc.2之后,优化了build后的文件生成结构,生成的目录结构保持了源文件夹下的目录结构,有利于对分包的支持。</p>
<p> </p>
<h3>3.注意事项:新增的页面需要重新 npm run dev 或 yarn run dev来进行编译</h3>
<p> </p>
<h3>4.不要在选项属性或回调上使用箭头函数</h3>
<p>比如:</p>
<div class="cnblogs_code">
<pre>created: () => console.log(<span style="color: rgba(0, 0, 255, 1)">this</span>.a)</pre>
</div>
<p>或</p>
<div class="cnblogs_code">
<pre>vm.$watch('a', newValue => <span style="color: rgba(0, 0, 255, 1)">this</span>.myMethod())</pre>
</div>
<p>因为箭头函数是和父级上下文绑定在一起的,<span style="background-color: rgba(255, 255, 0, 1)">this</span>不会是如你做预期的vue实例,且<span style="background-color: rgba(255, 255, 0, 1)">this.a</span>或<span style="background-color: rgba(255, 255, 0, 1)">this.myMethod</span>也会是未定义的</p>
<p> </p>
<p>5.微信小程序的页面的<span style="background-color: rgba(255, 255, 0, 1)">query</span>参数是通过<span style="background-color: rgba(255, 255, 0, 1)">onLoad</span>获取的,mpvue对此进行了优化,直接通过<span style="background-color: rgba(255, 255, 0, 1)">this.$root.$mp.query</span>获取相应的数据参数,其调用需要在<span style="background-color: rgba(255, 255, 0, 1)">onLoad</span>生命周期出发之后使用,比如<span style="background-color: rgba(255, 255, 0, 1)">onShow</span>等</p>
<p> </p>
<h3>6.不支持 v-html</h3>
<p> </p>
<h3>7.不支持部分复杂的JavaScript渲染表达式</h3>
<p> </p>
<h3>8.不支持过滤器</h3>
<p> </p>
<h3>9.不支持在template内使用methods中的函数</h3>
<p> </p>
<h3>10.class支持的语法:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p </span><span style="color: rgba(255, 0, 0, 1)">:class</span><span style="color: rgba(0, 0, 255, 1)">="{ active: isActive }"</span><span style="color: rgba(0, 0, 255, 1)">></span>111<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="static"</span><span style="color: rgba(255, 0, 0, 1)"> v-bind:class</span><span style="color: rgba(0, 0, 255, 1)">="{ active: isActive, 'text-danger': hasError }"</span><span style="color: rgba(0, 0, 255, 1)">></span>222<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="static"</span><span style="color: rgba(255, 0, 0, 1)"> :class</span><span style="color: rgba(0, 0, 255, 1)">=""</span><span style="color: rgba(0, 0, 255, 1)">></span>333<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="static"</span><span style="color: rgba(255, 0, 0, 1)"> v-bind:class</span><span style="color: rgba(0, 0, 255, 1)">=""</span><span style="color: rgba(0, 0, 255, 1)">></span>444<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="static"</span><span style="color: rgba(255, 0, 0, 1)"> v-bind:class</span><span style="color: rgba(0, 0, 255, 1)">="[{ active: isActive }, errorClass]"</span><span style="color: rgba(0, 0, 255, 1)">></span>555<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>将分别被转换成:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="_p {{}}"</span><span style="color: rgba(0, 0, 255, 1)">></span>111<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="_p static {{}}"</span><span style="color: rgba(0, 0, 255, 1)">></span>222<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="_p static {{}}"</span><span style="color: rgba(0, 0, 255, 1)">></span>333<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="_p static {{}}"</span><span style="color: rgba(0, 0, 255, 1)">></span>444<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="_p static {{[, errorClass]}}"</span><span style="color: rgba(0, 0, 255, 1)">></span>555<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<h3>11.style支持的语法:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p </span><span style="color: rgba(255, 0, 0, 1)">v-bind:style</span><span style="color: rgba(0, 0, 255, 1)">="{ color: activeColor, fontSize: fontSize + 'px' }"</span><span style="color: rgba(0, 0, 255, 1)">></span>666<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p </span><span style="color: rgba(255, 0, 0, 1)">v-bind:style</span><span style="color: rgba(0, 0, 255, 1)">="[{ color: activeColor, fontSize: fontSize + 'px' }]"</span><span style="color: rgba(0, 0, 255, 1)">></span>777<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>将分别被转换成:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="_p"</span><span style="color: rgba(255, 0, 0, 1)"> style</span><span style="color: rgba(0, 0, 255, 1)">=" {{'color:' + activeColor + ';' + 'font-size:' + fontSize + 'px' + ';'}}"</span><span style="color: rgba(0, 0, 255, 1)">></span>666<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="_p"</span><span style="color: rgba(255, 0, 0, 1)"> style</span><span style="color: rgba(0, 0, 255, 1)">=" {{'color:' + activeColor + ';' + 'font-size:' + fontSize + 'px' + ';'}}"</span><span style="color: rgba(0, 0, 255, 1)">></span>777<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>不支持vue官网的class和style绑定语法</p>
<p> </p>
<h3>12.用computed方法生成class或style字符串,插入到页面中</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 支持 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="container"</span><span style="color: rgba(255, 0, 0, 1)"> :class</span><span style="color: rgba(0, 0, 255, 1)">="computedClassStr"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="container"</span><span style="color: rgba(255, 0, 0, 1)"> :class</span><span style="color: rgba(0, 0, 255, 1)">="{active: isActive}"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 不支持 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="container"</span><span style="color: rgba(255, 0, 0, 1)"> :class</span><span style="color: rgba(0, 0, 255, 1)">="computedClassObject"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
export </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">default</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
data () {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">return</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
isActive: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">true</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
}
},
computed: {
computedClassStr () {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">return</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.isActive </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">?</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">active</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> : </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">''</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
},
computedClassObject () {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">return</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> { active: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.isActive }
}
}
}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<h3>13.嵌套列表渲染必须指定不同的索引</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 在这种嵌套循环的时候, index 和 itemIndex 这种索引是必须指定,且别名不能相同,正确的写法如下 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">ul </span><span style="color: rgba(255, 0, 0, 1)">v-for</span><span style="color: rgba(0, 0, 255, 1)">="(card, index) in list"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li </span><span style="color: rgba(255, 0, 0, 1)">v-for</span><span style="color: rgba(0, 0, 255, 1)">="(item, itemIndex) in card"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
{{item.value}}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<h3>14.事件处理器,全支持。</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 事件映射表,左侧为 WEB 事件,右侧为 小程序 对应事件</span>
<span style="color: rgba(0, 0, 0, 1)">{
click: </span>'tap'<span style="color: rgba(0, 0, 0, 1)">,
touchstart: </span>'touchstart'<span style="color: rgba(0, 0, 0, 1)">,
touchmove: </span>'touchmove'<span style="color: rgba(0, 0, 0, 1)">,
touchcancel: </span>'touchcancel'<span style="color: rgba(0, 0, 0, 1)">,
touchend: </span>'touchend'<span style="color: rgba(0, 0, 0, 1)">,
tap: </span>'tap'<span style="color: rgba(0, 0, 0, 1)">,
longtap: </span>'longtap'<span style="color: rgba(0, 0, 0, 1)">,
input: </span>'input'<span style="color: rgba(0, 0, 0, 1)">,
change: </span>'change'<span style="color: rgba(0, 0, 0, 1)">,
submit: </span>'submit'<span style="color: rgba(0, 0, 0, 1)">,
blur: </span>'blur'<span style="color: rgba(0, 0, 0, 1)">,
focus: </span>'focus'<span style="color: rgba(0, 0, 0, 1)">,
reset: </span>'reset'<span style="color: rgba(0, 0, 0, 1)">,
confirm: </span>'confirm'<span style="color: rgba(0, 0, 0, 1)">,
columnchange: </span>'columnchange'<span style="color: rgba(0, 0, 0, 1)">,
linechange: </span>'linechange'<span style="color: rgba(0, 0, 0, 1)">,
error: </span>'error'<span style="color: rgba(0, 0, 0, 1)">,
scrolltoupper: </span>'scrolltoupper'<span style="color: rgba(0, 0, 0, 1)">,
scrolltolower: </span>'scrolltolower'<span style="color: rgba(0, 0, 0, 1)">,
scroll: </span>'scroll'<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p>在input和textarea中change事件会被转为blur事件</p>
<p>小程序能力所致,bind和catch事件同时绑定时,只会触发bind,catch不会被触发,要避免踩坑。</p>
<p>事件修饰符:</p>
<table style="width: 600px" border="1">
<tbody>
<tr style="background-color: rgba(154, 205, 50, 1)">
<td>修饰符</td>
<td>说明</td>
</tr>
<tr>
<td>.stop</td>
<td>阻止冒泡,但是同时绑定了一个非冒泡事件,会导致该元素上的catchEventName失效</td>
</tr>
<tr>
<td>.prevent</td>
<td>可以直接干掉,因为小程序里没有什么默认事件,比如submit并不会跳转页面</td>
</tr>
<tr>
<td>.capture</td>
<td> </td>
</tr>
<tr>
<td>.self</td>
<td>没有可以判断的标识</td>
</tr>
<tr>
<td>.once</td>
<td>也不能做,因为小程序没有removeEventListener,虽然可以直接在handleProxy中处理,但非常的不优雅,违背了意愿,暂不考虑</td>
</tr>
<tr>
<td>键值修饰符</td>
<td>在小程序中没有键盘,所以...</td>
</tr>
</tbody>
</table>
<p> </p>
<p> </p>
<h3>15.表单控件绑定,几乎全支持。</h3>
<p>建议直接使用微信小程序表单组件。用法示例:</p>
<p>select组件用picker组件进行代替</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">picker </span><span style="color: rgba(255, 0, 0, 1)">@change</span><span style="color: rgba(0, 0, 255, 1)">="bindPickerChange"</span><span style="color: rgba(255, 0, 0, 1)"> :value</span><span style="color: rgba(0, 0, 255, 1)">="index"</span><span style="color: rgba(255, 0, 0, 1)"> :range</span><span style="color: rgba(0, 0, 255, 1)">="array"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="picker"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
当前选择:{{array}}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">picker</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
export </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">default</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
data () {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">return</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
index: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">,
array: [</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">A</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">B</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">C</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">]
}
},
methods: {
bindPickerChange (e) {
console.log(e)
}
}
}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>表单元素radio用radio-group组件进行代替</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">radio-group </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="radio-group"</span><span style="color: rgba(255, 0, 0, 1)"> @change</span><span style="color: rgba(0, 0, 255, 1)">="radioChange"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">label </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="radio"</span><span style="color: rgba(255, 0, 0, 1)"> v-for</span><span style="color: rgba(0, 0, 255, 1)">="(item, index) in items"</span><span style="color: rgba(255, 0, 0, 1)"> :key</span><span style="color: rgba(0, 0, 255, 1)">="item.name"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">radio </span><span style="color: rgba(255, 0, 0, 1)">:value</span><span style="color: rgba(0, 0, 255, 1)">="item.name"</span><span style="color: rgba(255, 0, 0, 1)"> :checked</span><span style="color: rgba(0, 0, 255, 1)">="item.checked"</span><span style="color: rgba(0, 0, 255, 1)">/></span><span style="color: rgba(0, 0, 0, 1)"> {{item.value}}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">label</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">radio-group</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
export </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">default</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
data () {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">return</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
items: [
{name: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">USA</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, value: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">美国</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">},
{name: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">CHN</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, value: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">中国</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, checked: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">true</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">},
{name: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">BRA</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, value: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">巴西</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">},
{name: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">JPN</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, value: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">日本</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">},
{name: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">ENG</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, value: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">英国</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">},
{name: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">TUR</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, value: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">法国</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}
]
}
},
methods: {
radioChange (e) {
console.log(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">radio发生change事件,携带value值为:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, e.target.value)
}
}
}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<h3>16.详细的不支持列表:</h3>
<ul>
<li>暂不支持在组件引用时,在组件上定义click等原生事件、v-show(可用v-if代替)和class style等样式属性</li>
<li>例:<card class="class-name"> </card>样式时不会生效的,因为编译到wxml,小程序不会生成节点,建议写在内部顶级元素上</li>
<li>Slot(scoped暂时还没做支持)</li>
<li>动态组件</li>
<li>异步组件</li>
<li>inline-template</li>
<li>X-Templates</li>
<li>keep-alive</li>
<li>transition</li>
<li>class</li>
<li>style</li>
</ul>
<p> </p>
<h3>17.mpvue可以支持小程序的原生组件</h3>
<p>比如picker,map等等。需要注意的是原生组件上的事件绑定,需要以vue的事件绑定语法来绑定,如 bindchange="eventName"事件需要写成@change="eventName"</p>
<p>示例代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">picker </span><span style="color: rgba(255, 0, 0, 1)">mode</span><span style="color: rgba(0, 0, 255, 1)">="date"</span><span style="color: rgba(255, 0, 0, 1)"> :value</span><span style="color: rgba(0, 0, 255, 1)">="date"</span><span style="color: rgba(255, 0, 0, 1)"> start</span><span style="color: rgba(0, 0, 255, 1)">="2015-09-01"</span><span style="color: rgba(255, 0, 0, 1)"> end</span><span style="color: rgba(0, 0, 255, 1)">="2017-09-01"</span><span style="color: rgba(255, 0, 0, 1)"> @change</span><span style="color: rgba(0, 0, 255, 1)">="bindDateChange"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="picker"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
当前选择: {{date}}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">picker</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<h3>18.TypeScript支持</h3>
<p>配置方法 http://mpvue.com/build/mpvue-loader/#typescript, Demo见 mpvue-ts-demo</p>
<p> </p>
<h3>19.最佳实践</h3>
<p>(1)精简data数据</p>
<p>(2)优化长列表性能</p>
<ul>
<li>避免在v-for中嵌套子组件,这样可以优化大部分setData时的冗余数据</li>
<li>直接通过样式display来展示和隐藏</li>
</ul>
<p>(3)合理使用双向绑定,建议使用 v-model.lazy绑定方式以优化性能</p>
<p>(4)谨慎选择直接使用小程序的API,如果你有小程序和H5福永代码的需要,业务代码需要保持对WEB Vue.js的兼容性。可通过桥接适配层屏蔽两端差异。</p>
<p> </p>
<h3>20.常见问题</h3>
<p>(1)如何获取小程序在page onLoad时候传递的options</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">this</span>.$root.$mp.query</pre>
</div>
<p>(2)如何获取小程序在app onLaunch/onShow的时候传递的options</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">this</span>.$root.$mp.appOptions</pre>
</div>
<p>(3)如何捕获app的onError</p>
<p>由于onError不是完整意义的生命周期,所以只提供一个捕获错误的方法,在app的根组件上添加名为onError的回调函数即可,如下:</p>
<div class="cnblogs_code">
<pre>export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 只有 app 才会有 onLaunch 的生命周期</span>
<span style="color: rgba(0, 0, 0, 1)"> onLaunch () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ...</span>
<span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 捕获 app error</span>
<span style="color: rgba(0, 0, 0, 1)"> onError (err) {
console.log(err)
}
}</span></pre>
</div>
<p> </p>
<h3>21.mpvue框架使用场景汇总</h3>
<p>mpvue小程序框架包含:</p>
<ul>
<li>运行时JS SDK</li>
<li>初始化模板项目(包含推荐的目录结构,webpack构建,代码检查配置等)</li>
<li>项目构建所需的npm依赖(已经包含在项目模板中,无需手动引入)</li>
</ul>
<p>开发者可能会面对的四种典型场景:</p>
<ul>
<li>单独以mpvue框架构建小程序
<ul>
<li>推荐的方式,无需额外支持</li>
</ul>
</li>
<li>mpvue框架为主,同时使用其它框架(原生开发方式或wepy等)</li>
<li>已经使用其他框架,引入mpvue做部分模块的开发</li>
<li>只是用mpvue的JS SDK,自定义构建策略</li>
</ul>
<p> </p>
<p> </p>
<p>(完)</p>
<p>以上笔记摘自: mpvue官方文档 http://mpvue.com/mpvue/</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/cathy1024/p/10877248.html
頁:
[1]