模板编译器
按照官方指南并使用组件的内联模板,只会显示空白的内容,我之前的《vue引入插件》博文中遇到过在main.js中直接用
const Foo = { template: '<div>foo</div>' };这样我是出现了未渲染成功的组件情况,审查元素是用了一个注释便签代替的”<!--function(e,n,r,o){return ln(t,e,n,r,o,!0)}-->“。使用渲染函数render或 组件定义模板时就能正常显示,当时我就是单独foo.vue这样正常显示,现在想来是编译后形成render的方式渲染。原因就是我当时使用的是npm引入的vue,并不是script标签直接引入的vue,我用的npm引入的vue是不带模板编译器的。如果不使用render非要使用字符串模板动态生成,需要script引入vue并且设置别名,效率也会降低。
属性变化
vue的组件属性的getter和setter被覆盖,用于通知虚拟树更新数据。
var vm = new Vue({
el: '#vm',
template: `<div>{{ item.count }}<input type="button" value="Click" @click="updateCount"/></div>`,
data: {
item: {}
},
beforeMount () {
this.$data.item.count = 0;
},
methods: {
updateCount () {
// JavaScript object is updated but
// the component template is not rendered again
this.$data.item.count++;
}
}
}); 在上面的代码中,count的修改是不会触发虚拟树的更新,因为在定义时,item并不包括count属性,没有被覆盖getter和setter。
beforeMount () {
// 通过触发item的变化,让item对象里的属性都自动被覆盖getter和setter
this.$data.item = {
count: 0
};
// 主动指定count属性被覆盖getter和setter
this.$set(this.$data.item, 'count', 0);
//或者
Vue.set(this.$data.item, 'count', 0);
}
组件设置组件名
设置组件名对于出错时,堆栈中显示能快速定位错误位置。
多个组件不能公用同一个组件定义js对象
不要为了方便,将相同的组件定义提取成一个单独的js,然后多个组件引用。
//user.js
const User = {
data: () => ({
user: {
name: 'John Doe'
}
})
};
export default User;
//user-read-only.vue
<template><div>{{ user.name }}</div></template>
<script src="./user.js"></script>
//user-read-write.vue
<template><input v-model="user.name"/></template>
<script src="./user.js"></script>
//main.js
import UserReadWrite from './user-read-write.vue';
import UserReadOnly from './user-read-only.vue';
Vue.component('UserReadOnly', UserReadOnly);
Vue.component('UserReadWrite', UserReadWrite);
var vm = new Vue({
el: '#app',
template: `<div><UserReadOnly/><UserReadWrite/></div>` //这里希望显示两个不同的组件
}); 组后引入的组件将覆盖前面的引用相同定义文件的组件,最后将渲染显示两个相同的组件readonly。
