钩子函数created()和mount()区别
created()是在创建数据代理之后执行的,mount()是在将虚拟dom渲染成真实dom之后执行的
vue的数据代理和数据劫持
开发者工具里获取vue中data的一个数据时可以看到有一个{...}
,在我们点击之后才能获取到数据。
这是因为vue在初始化时用Object.defineProperty()做了数据代理,所以data里的每个属性都会有getter()方法和setter()方法。
数据代理就是我们访问data里的数据,调用Object.defineProperty()里的getter()方法。
数据劫持就是我们修改data里的数据,调用Object.defineProperty()里的setter()方法。
vue2响应式
响应式数据就是数据改变后,页面也会随之重新局部渲染(diff算法)
vue2不能使用this.变量名 = 变量值
设置一个响应式数据,需要用this.$set()
方法
v-for里的:key值
v-for="(item, index) in array" :key="index"
这个是一种常用的v-for用法,但如果item
的属性有唯一主键(id)的话最好用:key="item.id"
,在array插入一个元素或删除一个元素的时候能优化重新渲染元素的性能(diff算法)
export default{}和Vue.extend({})
在初学Vue组件化的时候都会使用Vue.extend({}),为什么后面直接变成export default{}了呢?
在使用const vc = Vue.extend({})
的时候,子组件同样需要export进行导出,也就是在该组件文件末尾需要export default vc;
。
vue2文档规定,在创建子组件的时候可以省略Vue.extend(),意思是创建Vue组件对象不需要调用Vue.extend()方法,在Vue对象的Components方法注册子组件的时候,Vue脚手架会为Vue子组件自动调用Vue.extend()方法,所以我们就从Vue.extend({})
优化成了{}
,再加上默认导出就变成了export default{}
render()函数
javascript
//引入vue模块
import Vue from 'vue'
//导入App组件
import App from './APP.vue'
Vue.config.productionTip = false
new Vue({
render: h => h(App),
//$mount('#app')挂载到#app元素上
}).$mount('#app')
在vue脚手架创建的vue2项目里有一个main.js文件,里面有一个render: h => h(App)
,解释一下。
vue2默认不带渲染功能,意思是如果直接写一个template,其实是不会被渲染到浏览器的,使用render()函数的话就能渲染。
javascript
render(a) {
console.log(a)
}
调用render函数会发现里面有一个参数,这个参数是一个方法createElement()
,顾名思义,使用这个方法可以直接创建元素。再次调用render()函数根据App组件创建元素
javascript
render(createElement){
createElement(App)
}
箭头函数各种简化之后就变成了
javascript
//可以是h,也可以是abcdefg,随便命名
render: h => h(app)