listArray:['a','b','c']
,今天小编就来说说关于vue 知识总结?下面更多详细答案一起来看看吧!
vue 知识总结
基础认识变量- 模板中使用变量用 {{}},也叫字面量或者插值表达式
- 类似python里的列表
listArray:['a','b','c']
- 类似python里的字典
listObject:{
GirlOne:'a',
GirlTwo:'b',
GirlThree:'c'
}
'<div>{{counter}}</div>'
- 页面加载渲染完成,自动执行的方法
mounted() {
console.log('页面加载完成后-自动执行')
},
- 绑定事件
- 简写就是@
- 判断,它的作用是如果值为真,就显示这个DOM元素,如果为假,就不显示这个元素
- 判断可以用三元运算符
:class="message=='jspang.com'?'one':'two'"
template: `
<h2 @click="handleItemClick" v-if="message=='jspang.com'" class="one" > {{message}} </h2>
<h2 @click="handleItemClick" v-else class="three"> {{message}} </h2>
`
- 循环
- 数组循环为了提高循环时性能,在数组其中一项变化后,整个数组不进行全部重新渲染,Vue提供了绑定key值的使用方法,目的就是增加渲染性能,避免重复渲染。加唯一性key值,增加后vue就会辨认出哪些内容被渲染后并没有变化,而只渲染新变化的内容。
<ul>
<li v-for="(item,index) in listArray" :key="index item">
[{{index}}]{{item}}
</li>
</ul>
- 对象循环
data(){
return{
listObject:{
GirlOne:'a',
GirlTwo:'b',
GirlThree:'c'
}
}
}
<ul>
<li v-for="(value,key,index) in listObject" :key="key">
[{{index}}]{{value}}-{{key}}
</li>
</ul>
- 数字循环
<span v-for="count in 99">{{count}},</span>
- v-for中使用v-if要用template标签,一个空的占位符。比如有三个值,只要其中两个,不用template的话,html里还是会出来三个。
<ul>
<template
v-for="(item,index) in listArray"
:key="index item"
>
<li v-if="item != 'a'">
[{{index}}]{{item}}
</li>
</template>
</ul>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>佳丽列表</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="app"></div>
</body>
<script>
Vue.createApp({
data() {
return {
inputValue: '',
list: ['1号', '2号', '3号'] ,
setMeal: 'china america',
isShowMeal: false ,
}
},
methods: {
handleAddItem() {
this.list.push(this.inputValue)
this.inputValue = ''
},
welcomeBtnClick(){
// alert('111')
this.content = 'huanying'
},
byeBtnClick(){
// alert('222')
this.content = 'baibai'
},
showOrHideBtnClick(){
this.isShowMeal = !this.isShowMeal // 将操作者取反 false变成true
}
},
template: `
<div>
<div>
<button v-on:click="welcomeBtnClick">laila</button>
<button v-on:click="byeBtnClick">zoula</button>
<div v-if='isShowMeal'>{{setMeal}}</div>
<button v-on:click="showOrHideBtnClick">show/not show</button>
</div>
<input v-model="inputValue" />
<button v-on:click="handleAddItem">增加佳丽</button>
<ul>
<li v-for= "item of list">{{item}}</li>
</ul>
</div>
`
}).mount("#app")
</script>
</html>
- v-html 可以将变量返回html
- v-once data中的数据如何变化,模板也不会再次重新渲染
- v-bind 绑定属性,不绑定的话就是字符串,不会随数据变化,简写就是直接一个冒号
<h2 v-bind:title="message2">{{message2}}</h2>
<h2 :title="message2">{{message2}}</h2>
<script>
const app = Vue.createApp({
data() {
return {
message: 'jspang.com',
count: 5,
message2: 'xxxxxx'
}
},
methods: {
handleItemClick() {
this.message = this.message == 'jspang.com' ? "技术胖" : "jspang.com"
}
},
template: `<h2
v-on:click="handleItemClick"
v-html="message"
v-once
> </h2>
<div>{{count>2?'大':'小'}}</div> # 三元表达式 在模板中可以使用js的表达式
<h2 v-bind:title="message2">{{message2}}</h2> # 不用v-bind title就是message2字符串
`
})
const vm = app.mount("#app")
</script>
- v-show是单个判断,true就显示,false就不显示。
- 控制的是css样式,也就是display:none。
- 如果显示和隐藏的状态切换比较频繁,并且没有什么多余复杂的业务逻辑,建议使用v-show,因为他不会一直渲染你的页面DOM元素,这或多或少对性能和稳定性有点提升。
<script>
const app=Vue.createApp({
data(){
return{
show: true,
}
},
template:`
<h2 v-show="show">JSPang.com</h2>
`
})
const vm=app.mount("#app")
</script>
- 创建一个vue应用
const app = Vue.createApp(){}
- 挂载到html的dom上
app.mount("#app")
- 在使用mount()方法时,会返回根组件。返回的是proxy形式的对象
- mvvm解释: 第一个m代表model数据,第一个v代表view视图,最后两个字幕vm代表viewModel视图数据连接层。
<script>
const app = Vue.createApp({
data() {
return {
message: 'jspang.com' //1.在这里定义了数据,也就是`model`数据
}
},
template: "<h2>{{message}}</h2>" //2.在这里定义了模板,也就是`view`,
//定义后的自动关联,就叫做`vm`,viewModel数据视图连接层。
})
app.mount("#app")
</script>
- 在某一时间会自动执行的函数
- 被动执行的函数,需要手动去点一下,才会执行
methods: {
handleItemClick() {
alert('jspang.com')
}
},
template: "<h2 v-on:click='handleItemClick'>{{message}}</h2>"
- 自动执行函数,mounted,没有任何操作,就会自动执行
- 8个生命周期函数
beforeCreate():在实例生成之前会自动执行的函数
created(): 在实例生成之后会自动执行的函数
beforeMount(): 在模板渲染完成之前执行的函数
mounted(): 在模板渲染完成之后执行的函数
beforeUpdate() :当data中的数据变化时, 会立即自动执行的函数
updated():当data中的数据发生变化,页面重新渲染完后,会自动执行的函数
beforeUnmount() :当Vue应用失效时,会自动执行的函数
unmounted() : 当Vue应用失效时,且DOM完全销毁之后,会自动执行
- setup() :开始创建组件之前,在beforeCreate和created之前执行。创建的是data和method
- onBeforeMount() : 组件挂载到节点上之前执行的函数。
- onMounted() : 组件挂载完成后执行的函数。
- onBeforeUpdate(): 组件更新之前执行的函数。
- onUpdated(): 组件更新完成之后执行的函数。
- onBeforeUnmount(): 组件卸载之前执行的函数。
- onUnmounted(): 组件卸载完成后执行的函数
- onActivated(): 被包含在中的组件,会多出两个生命周期钩子函数。被激活时执行。
- onDeactivated(): 比如从 A 组件,切换到 B 组件,A 组件消失时执行。
- onErrorCaptured(): 当捕获一个来自子孙组件的异常时激活钩子函数(以后用到再讲,不好展现)。
Vue2--------------vue3
beforeCreate -> setup()
created -> setup()
beforeMount -> onBeforeMount
mounted -> onMounted
beforeUpdate -> onBeforeUpdate
updated -> onUpdated
beforeDestroy -> onBeforeUnmount
destroyed -> onUnmounted
activated -> onActivated
deactivated -> onDeactivated
errorCaptured -> onErrorCaptured
- 用[xxx] xxx表示变量名 这样就是动态参数
<script>
const app = Vue.createApp({
data() {
return {
message: 'xxxx',
name: 'title',
event: 'click'
}
},
methods: {
hanldClick(){
alert('欢迎光临红浪漫')
}
},
template:`
<h2
@[event]="hanldClick" ## 等价于 v-on:click = 'hanldClick'
:[name]="message" ## 等价于 v-bind:title = 'xxxx'
>
{{message}}
</h2>
`
})
const vm = app.mount("#app")
</script>
- prevent
<form
action="https://jspang.com"
@click.prevent="hanldeButton">
<button type="submit">默认提交</button>
</form>
- 方法methods:只要页面重新渲染,就会重新执行方法,随便哪里更新了,就会更新
- 计算属性computed:当计算属性依赖的内容发生变更时,才会重新执行计算。就是和他相关的东西变了,这个值才会变。必须要返回一个值,而且在页面渲染的同时就会执行里边的业务逻辑。computed擅长处理的场景:一个数据受多个数据影响
- watch 侦听器的作用就是侦听一个data中的值的变化,变化后可以写一个方法,就是执行业务逻辑。watch擅长处理的场景:一个数据影响多个数据。界面渲染的时候不会执行,要等相关的数据变化后才执行。
- computed 和 method都能实现的功能,建议使用computed,因为有缓存,不用渲染页面就刷新。
- computed 和 watch 都能实现的功能,建议使用 computed,因为更加简洁。
<script>
const app=Vue.createApp({
data(){
return{
message:'jspang.com' ,
price: 10,
count: 2,
}
},
methods:{
getTotal(){
// return this.price * (this.count );
return Date.now()
},
addCount(){
this.count
},
},
watch:{
count(current, prev){
console.log('count changed watch')
console.log('现在的值watch:',current)
console.log('变化前的值watch:',prev)
}
},
computed:{
total(){
return this.price * this.count;
},
getTime(){
return Date.now();
},
countComputed(current, prev){
console.log('count changed computed')
console.log('现在的值computed:',current)
console.log('变化前的值computed:',prev)
}
},
template:`
<h2>{{getTime}}</h2>
<h2>{{getTotal()}}</h2>
<h2> {{total}}</h2>
<button @click='addCount'>more</button>
<h2> {{countComputed}}</h2>
`
})
const vm=app.mount("#app")
</script>
- 用普通字符串进行绑定
- 使用样式就是用v-bind绑定变量,变量就是定义好的样式名字
- 用数组进行绑定,true代表绑定,false表示不绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Demo14</title>
<script src="https://unpkg.com/vue@next" ></script>
<style>
.red {color:red}
.green {color: green}
.background {background-color: yellow}
.redImport {color: red !important;}
</style>
</head>
<body>
<div id="app"></div>
</body>
<script>
const app=Vue.createApp({
data(){
return {
classString:'red',
classObject:{red:true,background:true},
classArray1:['green','background',{redImport:true}],
classArray2:['green','background',{red:true}],
}
},
template:`
<h2 :class="classArray1">1</h2>
<h2 :class="classArray2">2</h2>
`
})
const vm=app.mount("#app")
</script>
</html>
- 组件,component来生成一个组件,可以在模板中直接调用
app.component('sonCom',{
template:`
<div>SonCom</div>
`
})
template:`
<h2 :class="classArray">JSPang.com</h2>
<sonCom />
`
- 区分父子组件,被调用的是子组件,主动调用的就是父组件
- 行内样式
data(){
return{
//.....
styleString:'color:orange;',
styleObject:{
color:'red',
background:'yellow'
}
}
},
template:`
<h2 :style="styleString">JSPang.com</h2>
<h2 :style="styleObject">JSPang.com</h2>
`
- 用methods实现
- 用表达式实现
- event事件,没参数就直接方法里用event,有参数的情况下,在使用的时候要穿$event
- 调用两个方法要加上括号(),中间用逗号隔开
<script>
const app=Vue.createApp({
data(){
return{
count:0
}
},
methods:{
addCountClick(event){
this.count ;
console.log(event)
console.log(event.target)
},
addCountClick2(num,event){
this.count = num
console.log(event.target)
},
handleBtnClick1(){
alert(1)
},
handleBtnClick2(){
alert(2)
},
},
template:`
<div>目前已点佳丽数量{{count}}.</div>
<button @click=addCountClick>增加一位佳丽</button>
<button @click="count ">增加一位佳丽2</button>
<button @click=addCountClick2(2,$event)>增加一位佳丽3</button>
<button @click=handleBtnClick1(),handleBtnClick2()>增加一位佳丽4</button>
`
})
const vm=app.mount("#app")
</script>
- 冒泡事件,点add按钮,上面的handleBtnClick1方法也会触发,就是冒泡
methods:{
addCountClick(){
this.count
},
handleBtnClick1(){
alert(1)
},
},
template:`
<div @click="handleBtnClick1">
<div>number is{{count}}.</div>
<button @click=" addCountClick()">add</button>
</div>
`
- stop 阻止冒泡事件 <button @click.stop=" addCountClick()">add</button>
- self 只有点击道自己的时候才会触发
template:`
<div @click.self="handleBtnClick1">
点我
<div>目前已点佳丽数量{{count}}.</div>
<button @click=" addCountClick()">增加一位佳丽</button>
</div>
`
- preevent 阻止默认行为,如form提交表单
- capture 默认的冒泡都是从下到上,用了capture之后就是从上到下
template:`
<div @click.capture="handleBtnClick1"> //修改了此处
我是最外层的DIV文字
<div>目前已点佳丽数量{{count}}.</div>
<button @click=" addCountClick()">增加一位佳丽</button>
</div>
`
- once 只执行一次
<button @click.once="addCountClick()">增加一位佳丽</button>
- passive 解决滚动时性能的修饰符每次事件产生,浏览器都会去查询一下是否有preventDefault阻止该次事件的默认动作。我们加上passive就是为了告诉浏览器,不用查询了,我们没用preventDefault阻止默认动作。一般用在滚动监听,@scoll,@touchmove 。因为滚动监听过程中,移动每个像素都会产生一次事件,每次都使用内核线程查询prevent会使滑动卡顿。我们通过passive将内核线程查询跳过,可以大大提升滑动的流畅度passive和prevent冲突,不能同时绑定在一个监听器上
- 按键修饰keydown表示按键,响应所有按键enter 、tab、delete、esc、up 、down、left、right 这些加上之后,表示响应单独的按键
<script>
const app=Vue.createApp({
data(){
return{}
},
methods:{
handleKeyDown(){
console.log('keydown')
}
},
template:`
<div>
<input @keydown="handleKeyDown"/>
<input @keydown.enter="handleKeyDown"/>
</div>
`
})
const vm=app.mount("#app")
</script>
- 鼠标修饰符常用的就是 left、right、middle
<script>
const app=Vue.createApp({
data(){
return{}
},
methods:{
handleClick(){
alert('click')
}
},
template:`
<div @click.right="handleClick">xxxxxx</div>
`
})
const vm=app.mount("#app")
</script>
- input 双向绑定
- textarea 双向绑定vue中只要写单标签就行了,html还是要写双标签
- checkbox 双向绑定一个选项,设置一个布尔值来表示多个选项直接可以直接用数组来表示true-value,false-value。true的时候显示的值,和false的时候显示的值
- radio 双向绑定直接定义一个str字面量
- 修饰符lazy,失去焦点再进行改变,比如按了enter,才会更新number 输入的是数字,也会变成字符串trim 自动删除前后的空格,字符中间的不会删除
<script>
const app=Vue.createApp({
data(){
return{
name: '',
list: [],
checked:false,
str: '',
testAreaName: ''
}
},
methods:{
},
template:`
<div>
<div>{{name}}</div>
<input v-model="name" />
<div>{{checked}}<input type="checkbox" v-model="checked" /></div>
<div>
<div>{{testAreaName}}</div>
<div><textarea v-model="testAreaName" /></div>
</div>
<div>
{{list}}
a<input type="checkbox" v-model="list" value="a" />
b<input type="checkbox" v-model="list" value="b" />
c<input type="checkbox" v-model="list" value="c" />
</div>
<div>
{{str}}
a<input type="radio" v-model="str" value="a" />
b<input type="radio" v-model="str" value="b" />
c<input type="radio" v-model="str" value="c" />
</div>
</div>
`
})
const vm=app.mount("#app")
</script>
[toc]
基础认识变量- 模板中使用变量用 {{}},也叫字面量或者插值表达式
- 类似python里的列表
listArray:['a','b','c']
- 类似python里的字典
listObject:{
GirlOne:'a',
GirlTwo:'b',
GirlThree:'c'
}
'<div>{{counter}}</div>'
- 页面加载渲染完成,自动执行的方法
mounted() {
console.log('页面加载完成后-自动执行')
},
- 绑定事件
- 简写就是@
- 判断,它的作用是如果值为真,就显示这个DOM元素,如果为假,就不显示这个元素
- 判断可以用三元运算符
:class="message=='jspang.com'?'one':'two'"
template: `
<h2 @click="handleItemClick" v-if="message=='jspang.com'" class="one" > {{message}} </h2>
<h2 @click="handleItemClick" v-else class="three"> {{message}} </h2>
`
- 循环
- 数组循环为了提高循环时性能,在数组其中一项变化后,整个数组不进行全部重新渲染,Vue提供了绑定key值的使用方法,目的就是增加渲染性能,避免重复渲染。加唯一性key值,增加后vue就会辨认出哪些内容被渲染后并没有变化,而只渲染新变化的内容。
<ul>
<li v-for="(item,index) in listArray" :key="index item">
[{{index}}]{{item}}
</li>
</ul>
- 对象循环
data(){
return{
listObject:{
GirlOne:'a',
GirlTwo:'b',
GirlThree:'c'
}
}
}
<ul>
<li v-for="(value,key,index) in listObject" :key="key">
[{{index}}]{{value}}-{{key}}
</li>
</ul>
- 数字循环
<span v-for="count in 99">{{count}},</span>
- v-for中使用v-if要用template标签,一个空的占位符。比如有三个值,只要其中两个,不用template的话,html里还是会出来三个。
<ul>
<template
v-for="(item,index) in listArray"
:key="index item"
>
<li v-if="item != 'a'">
[{{index}}]{{item}}
</li>
</template>
</ul>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>佳丽列表</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="app"></div>
</body>
<script>
Vue.createApp({
data() {
return {
inputValue: '',
list: ['1号', '2号', '3号'] ,
setMeal: 'china america',
isShowMeal: false ,
}
},
methods: {
handleAddItem() {
this.list.push(this.inputValue)
this.inputValue = ''
},
welcomeBtnClick(){
// alert('111')
this.content = 'huanying'
},
byeBtnClick(){
// alert('222')
this.content = 'baibai'
},
showOrHideBtnClick(){
this.isShowMeal = !this.isShowMeal // 将操作者取反 false变成true
}
},
template: `
<div>
<div>
<button v-on:click="welcomeBtnClick">laila</button>
<button v-on:click="byeBtnClick">zoula</button>
<div v-if='isShowMeal'>{{setMeal}}</div>
<button v-on:click="showOrHideBtnClick">show/not show</button>
</div>
<input v-model="inputValue" />
<button v-on:click="handleAddItem">增加佳丽</button>
<ul>
<li v-for= "item of list">{{item}}</li>
</ul>
</div>
`
}).mount("#app")
</script>
</html>
- v-html 可以将变量返回html
- v-once data中的数据如何变化,模板也不会再次重新渲染
- v-bind 绑定属性,不绑定的话就是字符串,不会随数据变化,简写就是直接一个冒号
<h2 v-bind:title="message2">{{message2}}</h2>
<h2 :title="message2">{{message2}}</h2>
<script>
const app = Vue.createApp({
data() {
return {
message: 'jspang.com',
count: 5,
message2: 'xxxxxx'
}
},
methods: {
handleItemClick() {
this.message = this.message == 'jspang.com' ? "技术胖" : "jspang.com"
}
},
template: `<h2
v-on:click="handleItemClick"
v-html="message"
v-once
> </h2>
<div>{{count>2?'大':'小'}}</div> # 三元表达式 在模板中可以使用js的表达式
<h2 v-bind:title="message2">{{message2}}</h2> # 不用v-bind title就是message2字符串
`
})
const vm = app.mount("#app")
</script>
- v-show是单个判断,true就显示,false就不显示。
- 控制的是css样式,也就是display:none。
- 如果显示和隐藏的状态切换比较频繁,并且没有什么多余复杂的业务逻辑,建议使用v-show,因为他不会一直渲染你的页面DOM元素,这或多或少对性能和稳定性有点提升。
<script>
const app=Vue.createApp({
data(){
return{
show: true,
}
},
template:`
<h2 v-show="show">JSPang.com</h2>
`
})
const vm=app.mount("#app")
</script>
- 创建一个vue应用
const app = Vue.createApp(){}
- 挂载到html的dom上
app.mount("#app")
- 在使用mount()方法时,会返回根组件。返回的是proxy形式的对象
- mvvm解释: 第一个m代表model数据,第一个v代表view视图,最后两个字幕vm代表viewModel视图数据连接层。
<script>
const app = Vue.createApp({
data() {
return {
message: 'jspang.com' //1.在这里定义了数据,也就是`model`数据
}
},
template: "<h2>{{message}}</h2>" //2.在这里定义了模板,也就是`view`,
//定义后的自动关联,就叫做`vm`,viewModel数据视图连接层。
})
app.mount("#app")
</script>
- 在某一时间会自动执行的函数
- 被动执行的函数,需要手动去点一下,才会执行
methods: {
handleItemClick() {
alert('jspang.com')
}
},
template: "<h2 v-on:click='handleItemClick'>{{message}}</h2>"
- 自动执行函数,mounted,没有任何操作,就会自动执行
- 8个生命周期函数
beforeCreate():在实例生成之前会自动执行的函数
created(): 在实例生成之后会自动执行的函数
beforeMount(): 在模板渲染完成之前执行的函数
mounted(): 在模板渲染完成之后执行的函数
beforeUpdate() :当data中的数据变化时, 会立即自动执行的函数
updated():当data中的数据发生变化,页面重新渲染完后,会自动执行的函数
beforeUnmount() :当Vue应用失效时,会自动执行的函数
unmounted() : 当Vue应用失效时,且DOM完全销毁之后,会自动执行
- setup() :开始创建组件之前,在beforeCreate和created之前执行。创建的是data和method
- onBeforeMount() : 组件挂载到节点上之前执行的函数。
- onMounted() : 组件挂载完成后执行的函数。
- onBeforeUpdate(): 组件更新之前执行的函数。
- onUpdated(): 组件更新完成之后执行的函数。
- onBeforeUnmount(): 组件卸载之前执行的函数。
- onUnmounted(): 组件卸载完成后执行的函数
- onActivated(): 被包含在中的组件,会多出两个生命周期钩子函数。被激活时执行。
- onDeactivated(): 比如从 A 组件,切换到 B 组件,A 组件消失时执行。
- onErrorCaptured(): 当捕获一个来自子孙组件的异常时激活钩子函数(以后用到再讲,不好展现)。
Vue2--------------vue3
beforeCreate -> setup()
created -> setup()
beforeMount -> onBeforeMount
mounted -> onMounted
beforeUpdate -> onBeforeUpdate
updated -> onUpdated
beforeDestroy -> onBeforeUnmount
destroyed -> onUnmounted
activated -> onActivated
deactivated -> onDeactivated
errorCaptured -> onErrorCaptured
- 用[xxx] xxx表示变量名 这样就是动态参数
<script>
const app = Vue.createApp({
data() {
return {
message: 'xxxx',
name: 'title',
event: 'click'
}
},
methods: {
hanldClick(){
alert('欢迎光临红浪漫')
}
},
template:`
<h2
@[event]="hanldClick" ## 等价于 v-on:click = 'hanldClick'
:[name]="message" ## 等价于 v-bind:title = 'xxxx'
>
{{message}}
</h2>
`
})
const vm = app.mount("#app")
</script>
- prevent
<form
action="https://jspang.com"
@click.prevent="hanldeButton">
<button type="submit">默认提交</button>
</form>
- 方法methods:只要页面重新渲染,就会重新执行方法,随便哪里更新了,就会更新
- 计算属性computed:当计算属性依赖的内容发生变更时,才会重新执行计算。就是和他相关的东西变了,这个值才会变。必须要返回一个值,而且在页面渲染的同时就会执行里边的业务逻辑。computed擅长处理的场景:一个数据受多个数据影响
- watch 侦听器的作用就是侦听一个data中的值的变化,变化后可以写一个方法,就是执行业务逻辑。watch擅长处理的场景:一个数据影响多个数据。界面渲染的时候不会执行,要等相关的数据变化后才执行。
- computed 和 method都能实现的功能,建议使用computed,因为有缓存,不用渲染页面就刷新。
- computed 和 watch 都能实现的功能,建议使用 computed,因为更加简洁。
<script>
const app=Vue.createApp({
data(){
return{
message:'jspang.com' ,
price: 10,
count: 2,
}
},
methods:{
getTotal(){
// return this.price * (this.count );
return Date.now()
},
addCount(){
this.count
},
},
watch:{
count(current, prev){
console.log('count changed watch')
console.log('现在的值watch:',current)
console.log('变化前的值watch:',prev)
}
},
computed:{
total(){
return this.price * this.count;
},
getTime(){
return Date.now();
},
countComputed(current, prev){
console.log('count changed computed')
console.log('现在的值computed:',current)
console.log('变化前的值computed:',prev)
}
},
template:`
<h2>{{getTime}}</h2>
<h2>{{getTotal()}}</h2>
<h2> {{total}}</h2>
<button @click='addCount'>more</button>
<h2> {{countComputed}}</h2>
`
})
const vm=app.mount("#app")
</script>
- 用普通字符串进行绑定
- 使用样式就是用v-bind绑定变量,变量就是定义好的样式名字
- 用数组进行绑定,true代表绑定,false表示不绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Demo14</title>
<script src="https://unpkg.com/vue@next" ></script>
<style>
.red {color:red}
.green {color: green}
.background {background-color: yellow}
.redImport {color: red !important;}
</style>
</head>
<body>
<div id="app"></div>
</body>
<script>
const app=Vue.createApp({
data(){
return {
classString:'red',
classObject:{red:true,background:true},
classArray1:['green','background',{redImport:true}],
classArray2:['green','background',{red:true}],
}
},
template:`
<h2 :class="classArray1">1</h2>
<h2 :class="classArray2">2</h2>
`
})
const vm=app.mount("#app")
</script>
</html>
- 组件,component来生成一个组件,可以在模板中直接调用
app.component('sonCom',{
template:`
<div>SonCom</div>
`
})
template:`
<h2 :class="classArray">JSPang.com</h2>
<sonCom />
`
- 区分父子组件,被调用的是子组件,主动调用的就是父组件
- 行内样式
data(){
return{
//.....
styleString:'color:orange;',
styleObject:{
color:'red',
background:'yellow'
}
}
},
template:`
<h2 :style="styleString">JSPang.com</h2>
<h2 :style="styleObject">JSPang.com</h2>
`
- 用methods实现
- 用表达式实现
- event事件,没参数就直接方法里用event,有参数的情况下,在使用的时候要穿$event
- 调用两个方法要加上括号(),中间用逗号隔开
<script>
const app=Vue.createApp({
data(){
return{
count:0
}
},
methods:{
addCountClick(event){
this.count ;
console.log(event)
console.log(event.target)
},
addCountClick2(num,event){
this.count = num
console.log(event.target)
},
handleBtnClick1(){
alert(1)
},
handleBtnClick2(){
alert(2)
},
},
template:`
<div>目前已点佳丽数量{{count}}.</div>
<button @click=addCountClick>增加一位佳丽</button>
<button @click="count ">增加一位佳丽2</button>
<button @click=addCountClick2(2,$event)>增加一位佳丽3</button>
<button @click=handleBtnClick1(),handleBtnClick2()>增加一位佳丽4</button>
`
})
const vm=app.mount("#app")
</script>
- 冒泡事件,点add按钮,上面的handleBtnClick1方法也会触发,就是冒泡
methods:{
addCountClick(){
this.count
},
handleBtnClick1(){
alert(1)
},
},
template:`
<div @click="handleBtnClick1">
<div>number is{{count}}.</div>
<button @click=" addCountClick()">add</button>
</div>
`
- stop 阻止冒泡事件 <button @click.stop=" addCountClick()">add</button>
- self 只有点击道自己的时候才会触发
template:`
<div @click.self="handleBtnClick1">
点我
<div>目前已点佳丽数量{{count}}.</div>
<button @click=" addCountClick()">增加一位佳丽</button>
</div>
`
- preevent 阻止默认行为,如form提交表单
- capture 默认的冒泡都是从下到上,用了capture之后就是从上到下
template:`
<div @click.capture="handleBtnClick1"> //修改了此处
我是最外层的DIV文字
<div>目前已点佳丽数量{{count}}.</div>
<button @click=" addCountClick()">增加一位佳丽</button>
</div>
`
- once 只执行一次
<button @click.once="addCountClick()">增加一位佳丽</button>
- passive 解决滚动时性能的修饰符每次事件产生,浏览器都会去查询一下是否有preventDefault阻止该次事件的默认动作。我们加上passive就是为了告诉浏览器,不用查询了,我们没用preventDefault阻止默认动作。一般用在滚动监听,@scoll,@touchmove 。因为滚动监听过程中,移动每个像素都会产生一次事件,每次都使用内核线程查询prevent会使滑动卡顿。我们通过passive将内核线程查询跳过,可以大大提升滑动的流畅度passive和prevent冲突,不能同时绑定在一个监听器上
- 按键修饰keydown表示按键,响应所有按键enter 、tab、delete、esc、up 、down、left、right 这些加上之后,表示响应单独的按键
<script>
const app=Vue.createApp({
data(){
return{}
},
methods:{
handleKeyDown(){
console.log('keydown')
}
},
template:`
<div>
<input @keydown="handleKeyDown"/>
<input @keydown.enter="handleKeyDown"/>
</div>
`
})
const vm=app.mount("#app")
</script>
- 鼠标修饰符常用的就是 left、right、middle
<script>
const app=Vue.createApp({
data(){
return{}
},
methods:{
handleClick(){
alert('click')
}
},
template:`
<div @click.right="handleClick">xxxxxx</div>
`
})
const vm=app.mount("#app")
</script>
- input 双向绑定
- textarea 双向绑定vue中只要写单标签就行了,html还是要写双标签
- checkbox 双向绑定一个选项,设置一个布尔值来表示多个选项直接可以直接用数组来表示true-value,false-value。true的时候显示的值,和false的时候显示的值
- radio 双向绑定直接定义一个str字面量
- 修饰符lazy,失去焦点再进行改变,比如按了enter,才会更新number 输入的是数字,也会变成字符串trim 自动删除前后的空格,字符中间的不会删除
<script>
const app=Vue.createApp({
data(){
return{
name: '',
list: [],
checked:false,
str: '',
testAreaName: ''
}
},
methods:{
},
template:`
<div>
<div>{{name}}</div>
<input v-model="name" />
<div>{{checked}}<input type="checkbox" v-model="checked" /></div>
<div>
<div>{{testAreaName}}</div>
<div><textarea v-model="testAreaName" /></div>
</div>
<div>
{{list}}
a<input type="checkbox" v-model="list" value="a" />
b<input type="checkbox" v-model="list" value="b" />
c<input type="checkbox" v-model="list" value="c" />
</div>
<div>
{{str}}
a<input type="radio" v-model="str" value="a" />
b<input type="radio" v-model="str" value="b" />
c<input type="radio" v-model="str" value="c" />
</div>
</div>
`
})
const vm=app.mount("#app")
</script>