一、Vue 的应用及组件、生命周期函数、模版语法、computed 及 watcher、样式绑定语法、条件渲染、列表循环渲染、事件绑定和表单中双向绑定的指令
createApp
表示创建一个 Vue
应用,存储到 app
变量中。传入的参数表示,这个应用最外层的组件,应该如何展示。MVVM
设计模式,m -> model
数据,v -> view
视图,vm -> viewModel
视图数据连接层,vm
代表的就是 vue
应用的根组件,如下所示:
const app = Vue.createApp({
data () {
return (
message: 'hello world'
)
},
template: "<div>{{message}}</div"
});
const vm = app.mount('#root');
- 生命周期函数是在某一时刻会自动执行的函数,如下所示:
beforeCreate()
,在实例生成之前会自动执行的函数created()
,在实例生成之后会自动执行的函数beforeMount()
,在模版已经被编程函数之后立即自动执行的函数,在组件内容被渲染到页面之前自动执行的函数mounted()
,在组件内容被渲染到页面之后自动执行的函数beforeUpdate()
,当 data
中的数据发生变化时会自动执行的函数updated()
,当 data
中的数据发生变化,同时页面完成更新后,会自动执行的函数beforeUnmount()
,当 Vue
应用失效时,自动执行的函数unmounted()
,当 Vue
应用失效时,且 dom
完全销毁之后,自动执行的函数
- 模版语法,
{{}}
插值表达式、v-on(@)
、v-bind(:)
、v-html
、动态参数、修饰符等等,如下所示:
const app = Vue.createApp({
data () {
return (
message: 'hello world',
show: false,
name: 'title',
event: 'mouseenter'
)
},
methods: {
handleClick () {
alert('click')
}
},
template: `
<form action="https://www.baidu.com" @click.prevent="handleClick>
<button type="submit>提交</button>
</form>
`
})
const vm = app.mount('#root');
- 在
methods
中,方法里面的 this
都是指向对应 vue
的实例或者是 vue
组件的实例里面。在外层的 this
,是指向 window
。在 methods
中,只要页面重新渲染,才会重新计算。在 computed
中,当计算属性依赖的内容发生变更时,才会重新执行计算。在 watch
中,侦听器监听属性发生变化后,函数会执行。computed
和 method
都能实现的一个功能,建议使用 computed
,因为有缓存。computed
和 watcher
都能实现的功能,建议使用 computed
,因为更简洁,如下所示:
const app = Vue.createApp({
data () {
return (
message: 'hello world',
count: 2,
price: 5,
newTotal: 10,
)
},
watch: {
price(current, prev) {
this.newTotal = current * this.count
}
},
computed: {
total() {
return Date.now() + this.count
}
},
methods: {
formatString(string) {
return string.toUpperCase();
},
getTotal() {
return Date.now()
},
},
template: `
<div>{{message}} {{newTotal}}</div>
`
});
const vm = app.mount('#root');
- 样式绑定渲染,可以使用
class
的写法,也可以使用 style
的写法,如下所示:
const app = Vue.createApp({
data () {
return (
classString: 'red',
classObject: { red: false, green: true },
classArray: ['red', 'green', { brown: false }],
styleString: 'color: yellow;background: orange',
styleObject: {
color: 'orange',
background: 'yellow'
}
)
},
template: `
<div :style="styleObject>
Hello World
</div>
`
});
app.component('demo', {
template: `
<div :class="$attrs.class">one</div>
<div :class="$attrs.class">two</div>
`
});
const vm = app.mount('#root');
- 条件渲染,
v-if
是控制 DOM
元素是否存在而显示,v-show
是控制 display: none;
是否存在而显示,如下所示:
const app = Vue.createApp({
data () {
return {
show: false,
conditionOne: false,
conditionTwo: true
}
},
template: `
<div v-if="show">Hello World</div>
<div v-if="conditionOne">if</div>
<div v-else-if="conditionTwo">else if</div>
<div v-else>else</div>
<div v-show="show">world</div>
`
});
const vm = app.mount('#root');
- 列表循环渲染,使用
v-for
,如下所示:
const app = Vue.createApp({
data () {
return {
listArray: ['tom', 'jack', 'student'],
listObect: {
firstName: 'tom',
lastName: 'jack',
job: 'student'
}
}
},
methods: {
handleAddBtnClick () {
this.listObect.age = 30;
this.listObect.sex = 'man';
}
},
template: `
<div>
<!--<div v-for="(item, index) in listArray" :key="index">-->
<!-- {{item}} -- {{index}}-->
<!--</div>-->
<template
v-for="(value, key, index) in listObect"
:key="index"
>
<div v-if="key !== 'lastName'">
{{value}} -- {{key}}
</div>
</template>
<div v-for="item in 10">{{item}}</div>
<button @click="handleAddBtnClick">新增</button>
</div>
`
});
const vm = app.mount('#root');
- 事件绑定,
event
、$event
,事件修饰符:stop,prevent,capture,self,once,passive
。按键修饰符:enter,tab,delete,esc,up,down,left,right
。鼠标修饰符:left,right,middle
。精确修饰符:exact
,如下所示:
const app = Vue.createApp({
methods: {
handleClick() {
console.log('click')
},
},
template: `
<div>
<div @click.ctrl.exact="handleClick">123</div>
</div>
`
});
const vm = app.mount('#root');
- 表单中的双向绑定,
input、textarea、checkbox、radio、select
,修饰符 lazy、number、trim
,如下所示:
const app = Vue.createApp({
data() {
return {
message: [],
options: [{
text: 'A', value: { value: 'A'},
}, {
text: 'B', value: { value: 'B'},
}, {
text: 'C', value: { value: 'C'},
}]
}
},
template: `
<div>
{{message}}
<select v-model="message" multiple>
<option v-for="item in options" :value="item.value">{{item.text}}</option>
</select>
<!--<input v-model.trim="message" />-->
</div>
`
});
const vm = app.mount('#root');