八个生命周期函数是在Vue实例在某个时间点自动执行的函数,不需要手动执行,八个钩子函数;
beforecreate/Created/
beforemounte/Mounted/:
beforeupdate/Updated/
beforedestroy/Destroyed: vm.$destroy()方法调用后会断开实例的双向绑定。
创建一个Vue实例时,会加入一个data对象,data对象中的属性的改变会引起视图的更新渲染;但是如果在创建实例时data中没有某个属性值例如属性b,是后期添加的,那么该新增的属性b的改变不会引起视图的变化。
var data = {a:1};
var vm = new Vue({
data: data;
});
//访问属性data,可以使用$美元符,以与自定义属性区别开
vm.$data===data; //true
//新增一个属性值
vm.b=2;
那么怎样处理才能使其后增加的属性也会引起视图的变化呢?
当确定后期需要某个属性时,可以先提前设置该属性值为空或者null。
Vue数据绑定语法
使用{}}}双花括号将文本括起来:{{message}}插值表达式
v-bind: 绑定属性 < a v-bind:href=“url”>… a> 绑定href属性 缩写为 :href
v-on:监听DOM事件 < a v-on:click=“方法名dosomething”>… a> 缩写 @click 方法可传参数或不传参数。
事件修饰符:.stop .prevent .capture .self .once .passive
eg: v-on:click.stop v-on:click.once
按键修饰符:.enter .tab .up .space .up .down .left
eg: v-on:keyup.enter
系统修饰符: .ctrl .alt .shift .meta
eg: v-on:keyup.shift
v-if/v-else: 条件性的渲染一块内容,在指令表达式返回truthy值时被渲染。会动态向DOM数添加或者删除元素。当值为false时,会将该元素从DOM树销毁;当为truthy时会编译渲染;频繁的切换会降低性能。
eg: < h1 v-if=‘colorsome’>some h1>
v-show: true或者false,表明是否显示元素,无论是否显示该元素都会被渲染并保留在DOM中。类似控制元素的display属性为none来控制隐藏。
计算属性computed
可用于较为复杂的逻辑运算,如字符串的翻转处理、根据姓和名得到姓名fullname。
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例, 将复杂的处理置于computed属性中。
return this.message.split('').reverse().join('')
}
}
})
监听属性watch
监听某个属性是否发生改变,若发生改变,则可进行相应的操作。
当需要在数据变化时执行异步或开销较大的操作时,监听属性比计算属性适用。
列表渲染v-for
迭代数组元素或者对象属性。不要在同一级同时使用v-if和v-for,若一起使用v-for优先级更高。即每次v-for循环时v-if在跟着运行
- <--!items为data中的属性-->
{{ item.message }}
v-model创建双向数据绑定,可用于,
双向绑定原理:
1-视图变化使得数据变化:利用了监听机制利用observer监听所有属性,当发生变化通过订阅者watcher是否要进行更新。
2-数据变化使得视图变化:利用了object.defineProperty(对象名obj, ‘要修改的属性名’, ‘要被修改的属性描述符set/get’)方法来重新定义对象的属性值get和set设置属性值。defineproperty用于数据劫持。
参考:https://www.cnblogs.com/libin-1/p/6893712.html
创建全局组件: Vue.component(‘组件名A’, {data: function{…}})
创建局部组件:最好命名用kebab-case小写加横杠。要在Vue实例中用components属性声明,如下:
var todoitem = {template: 'item' } //局部组件名,需要进行注册,即在Vue实例components中注册
//若局部组件不在一个.vue中,那么需要加入import
//import 组件文件名 from './包名/文件名.vue'
new Vue({
el: '#root',
components: {
'todo-item局部组件标签': todoitem //利用局部组件标签名来使用该组件
},
})
实际项目中,最好将组件放于components目录里,表示这是组件包。
组件挂载在Vue实例上: new Vue({el: ‘组件名A’})
组件中的data必须是一个函数,即
data: function() {…/…}
组件通信
插槽元素< slot>,在2.6版本的Vue中变成了v-slot
作用:在HTML的父组件中向子组件添加DOM元素,如下:span在页面上是不会显示的。
<div id="app">
<children>
<span>我是魔鬼</span>
<!--上面这行不会显示-->
</children>
</div>
<script>
var vm = new Vue({
el: '#app',
components: {
children: {
template: `我是子组件
`
}
}
});
</script>
参考:https://blog.csdn.net/qq_38128179/article/details/85273522
使用< slot>相当于为HTML父组件的DOM元素占了个位子,使得最后会显示出添加的DOM元素。
具名插槽–有名字的插槽
<div id="app">
<children>
<span slot="header">我是魔鬼span>
<span slot="footer">似魔鬼的步伐span>
children>
div>
<script>
var vm = new Vue({
el: '#app',
components: {
children: {
template: `
我是子组件
`
}
}
});
script>
作用域插槽–slot-scope
当子组件做循环但是DOM结构需要由外部传递时,可以使用作用域插槽。
在child子组件中循环显示出某个标签,可能是< li>可能是< ol>又或者是< h1>,但是child组件可能会用在其他地方,如果写死为< li>的话,跟最初的设计不符合。所以利用作用域插槽来实现由外部决定传递的标签是什么,组件只需要循环显示即可。适用于显示列表结构
在HTML页< template slot-scope=“任意名字xx”> 是固定搭配,关键在于< template> 包裹的要传递的标签需要使用{{xx.属性名}},属性名对应子组件中的< slot>标签里绑定的属性名:即 < li>{{props.itemC}} li> 的itemC 与
< slot v-for=“item of list” :itemC=item> slot> 中的itemC
<div id="root">
<child>
<template slot-scope="props">
<li>{{props.item}}li>
template>
child>
div>
<script>
Vue.component('child', {
data: function() {
return {
list: [1,2,3,4]
}
},
template: `
`
})
var vm = new Vue({
el: '#root'
})
script>
注意:在v2.6版本中,具名插槽和作用域插槽统一用v-slot来表示,v-slot结合了slot和slot-scope的特性。
当slot没有名字时,可在< template>中添加 v-slot:default 即为默认插槽< template v-slot:default >,当只有默认插槽时可以将v-slot:default用在组件标签上,注意:这时不可以有具名插槽或者作用域插槽!!
若插槽有名字,则为< template v-slot:插槽名字xx >或者可用 #插槽名字 来代替v-slot:
在< template>元素中的所有内容都会被传入相应的插槽中。另外,任何没有被包裹在带有v-slot的< template>中的内容都会被视为默认插槽的内容
//父组件中使用template
<template v-slot:default>
<div>div>
template>
<template v-slot:header>
<div>div>
template>
<template #header>
<div>div>
template>
<template v-slot:[dynamicSlotname]>
<div>div>
template>
<template v-slot[:插槽名字]="props">
<div>{{props.name}}div>
template>
参考1: https://www.jianshu.com/p/af7b8c4b77b2
参考2:https://www.w3cplus.com/vue/vue/vue-v-slot.html