本文记录学习过程中遇到的容易忽略的知识点。如有错误,欢迎指正。
ref
通常是一个静态属性。vue
可追踪的对象的属性不限制深度,深层嵌套的对象其属性仍是响应式的;watch
方法只能监听一层嵌套对象属性的变化,除非加deep:true
属性。vue
不允许动态添加根级别的响应式属性,必须在初始化实例前声明所有根级别响应式属性。vue
更新DOM
是异步的。this.$nextTick()
中回调函数不使用箭头函数,this
仍可以指向当前vue
的实例。prop
中的注意事项:
props
选项以字符串数组形式列出propprop
用来传递一个初始值,子组将将其作为一个本地数据使用,定义一个本地data属性,并将这个prop作为其初始值。prop
以原始的值传入且需要转换,用这个prop
定义一个计算属性javascript
对象和数组是通过引入传入的。对于一个数组或对象雷丁的prop
,在子组件中改变这个对象或数组本身会影响父组件的状态。
解决方案:
【1】 手写一个深拷贝
【2】JSON.parse()
和JSON.stringify()
var obj = {name:'xixi',age:20,company : { name : '腾讯', address : '深圳'} };
var obj_json = JSON.parse(JSON.stringify(obj));
【3】Lodash
中的_.cloneDeep()
var objects = [{ 'a': 1 }, { 'b': 2 }];
var deep = _.cloneDeep(objects);
【4】jquery
中的$.extend()
var obj = {name:'xixi',age:20,company : { name : '腾讯', address : '深圳'} };
var obj_extend = $.extend(true,{}, obj); //extend方法,第一个参数为true,为深拷贝,为false,或者没有为浅拷贝。
7.v-slot
:只能用在template
标签上。
8.mounted生命周期的误区
当前组件的mounted
生命周期函数,只在当前组件有效。如果当前组件引入了其他组件作为子组件,mounted
执行时只能保证当前组件的DOM
挂载成功,子组件的DOM
未必挂载成功。
9.父子组件生命周期的执行顺序
parent.vue
<template>
<div>
<p>我是父组件</p>
<child></child>
</div>
</template>
<script>
import Child from './child'
export default {
name: 'parent',
data: function () {
return {
arr: []
}
},
components: {
Child
},
beforeCreate () {
console.log('I am parents beforeCreated')
},
created () {
console.log('I am parents created')
},
beforeMount () {
console.log('I am parents beforeMount')
},
mounted () {
console.log('I am parents mounted')
}
}
</script>
<style scoped>
</style>
child.vue
<template>
<div>
<p>我是子组件</p>
</div>
</template>
<script>
export default {
name: 'child',
beforeCreate () {
console.log('I am child beforeCreated')
},
created () {
console.log('I am child created')
},
beforeMount () {
console.log('I am child beforeMount')
},
mounted () {
console.log('I am child mounted')
}
}
</script>
<style scoped>
</style>
运行,在console
中打印如下:
参考文章: