学习vue,顺手记录下的基础点笔记。
一定要有随手保存代码的习惯,除非你的开发工具设置了自动保存。
组件定义时名称为驼峰,例如HelloWorld,但在html里使用时用小写字母横杆连接,hello-world
自定义的组件在single-file components(.vue文件)/string template/jsx中使用时采用自闭合单标签形式,但是在html中使用时,要采用双标签,自闭合的单标签在默认情况下根本不管用。例如:<app/><hello-world/>这种写法浏览器只会渲染<app>组件,而会把<hello-world/>认为是<app></app>内容以至于被<app>的template覆盖了
用于快速定位到dom结构。
html使用<div ref='test'></div>
js使用this.$refs.test => div这个元素对象
v-if条件不符合时不会渲染对应元素
v-show条件不符合时会渲染对应元素,但样式设为display:none;
所以在选择使用哪个时,看使用场景,如果值不会频繁变化,就用v-if,但如果值会频繁变化时,使用v-show性能更好一些,因为v-if的元素切换时要渲染DOM元素这个过程是需要大量计算的,所以出于性能考虑我们一般是不赞成频繁进行DOM元素渲染的。
动态class的两种写法,对象和数组,当然也可以是单个变量
<span :class="{class1: hasClass1, class2: hasClass2}">ss</span>其中hasClass1和hasClass2是布尔型变量
<span :class=[class1, class2]>ss</span>其中class1和class2是字符串型变量,class名
动态style绑定的是对象,其中样式名称用驼峰写法例如font-size写成fontSize
父组件往子组件里插入内容
<!-- 常规使用 --> <!-- 子组件 --> <template> <p> <slot> 默认显示,当父组件没有往子组件插入内容 </slot> </p> </template> <!-- 父组件 --> <myComponent> {{parentData.title}} </myComponent> <!-- 如果父组件想插入子组件的值 --> <!-- 子组件 --> <template> <p> <slot :childData="childDa"> 默认显示,当父组件没有往子组件插入内容 </slot> </p> </template> <!-- 父组件 --> <myComponent> <template v-slot="props"> {{props.childData.property}} </template> </myComponent> <!-- 具名插槽:子组件好几个slot设置name --> <!-- 子组件 --> <template> <p> <slot name="slot1"></slot> </p> <p> <slot></slot> </p> <p> <slot name="slot2"></slot> </p> </template> <!-- 父组件 --> <myComponent> <template v-slot:slot1></template> <template></template> <template #slot2></template> </myComponent>页面数据更改后立刻获取DOM元素,不会获取到最新的,因为还没有渲染,这时想要得到最新的DOM,可以把访问DOM的代码放到 n e x t T i c k 里 。 nextTick里。 nextTick里。nextTick是基于Promise.resolve().then()执行的回调,所以会比setTimeout的回调执行的早一些,效率高。
export default { data() { return { list: ['1', '2'] } } methods: { test() { this.list.push('3') this.list.push('4') // 访问DOM元素放到$nextTick里 this.$nextTick(() => { console.log(this.$refs.listDom.childNodes.length) }) } } } // 不管list里push几个,会将data修改做整合,都只会渲染一次,异步渲染,$nextTick会在DOM渲染完之后回调。 // 上面代码如果不把访问DOM放到$nextTick里,它会打印出来2也就是push前的长度而不是我们需要的4.场景:缓存组件,tab频繁切换不需要重复渲染的情况,性能优化方式之一
当然,如果组件比较简单,也可以用v-show通过原生css来控制
使用方式:
<keep-alive> <myComponent1 v-if="flag==1"></myComponent1> <myComponent2 v-if="flag==2"></myComponent2> <myComponent3 v-if="flag==3"></myComponent3> </keep-alive>单个组件:
beforeCreate->created(实例初始化完毕)->beforeMount(生成虚拟DOM)->mounted(DOM渲染完毕)->beforeUpdate->updated->beforeDestroy(要解除自定义事件以及clearTimeout等)->destroyed
实例初始化各项目顺序:props -> methods ->data -> computed -> watch
父子组件:
父组件beforeCreate->父组件created->父组件beforeMount->子组件beforeCreate->子组件created->子组件beforeMount->子组件mounted->父组件mounted->父组件beforeUpdate->子组件beforeUpdate->子组件updated->父组件updated->父组件beforeDestroy->子组件beforedestroy->子组件destroyed->父组件destroyed
总结:初始化实例是父组件先初始化完毕,渲染是子组件先渲染完毕,更新是父先开始,子先更新完毕,销毁是父先开始销毁,子组件先销毁完毕。
父传子:props
子传父:this.$emit(‘事件名’,参数)
其他级别组件:event.$on(‘自定义事件名’,处理函数)
触发时使用event.$emit(‘自定义事件名’,参数)
组件销毁时移除自定义事件防止内存溢出 event.$off(‘自定义事件名’,处理函数)
mixin慎用,可能造成代码混乱,不易理解维护。