vue 知识总结(vue基础知识)

listArray:['a','b','c'] ,今天小编就来说说关于vue 知识总结?下面更多详细答案一起来看看吧!

vue 知识总结(vue基础知识)

vue 知识总结

基础认识变量
  • 模板中使用变量用 {{}},也叫字面量或者插值表达式
数组
  • 类似python里的列表

listArray:['a','b','c']

对象
  • 类似python里的字典

listObject:{ GirlOne:'a', GirlTwo:'b', GirlThree:'c' }

'<div>{{counter}}</div>'

mounted
  • 页面加载渲染完成,自动执行的方法

mounted() { console.log('页面加载完成后-自动执行') },

v-on
  • 绑定事件
  • 简写就是@
v-if,v-else
  • 判断,它的作用是如果值为真,就显示这个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> `

v-for
  • 循环
  • 数组循环为了提高循环时性能,在数组其中一项变化后,整个数组不进行全部重新渲染,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>

Demo

<!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,v-bind,v-once
  • 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
  • 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的方法createApp()
  • 创建一个vue应用

const app = Vue.createApp(){}

mount()
  • 挂载到html的dom上

app.mount("#app")

根组件vm
  • 在使用mount()方法时,会返回根组件。返回的是proxy形式的对象
mvvm
  • 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完全销毁之后,会自动执行

vue2和3生命周期函数对比
  • 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>

computed计算属性,watch监听器
  • 方法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>

数据双向绑定v-model
  • 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
  • 页面加载渲染完成,自动执行的方法

mounted() { console.log('页面加载完成后-自动执行') },

v-on
  • 绑定事件
  • 简写就是@
v-if,v-else
  • 判断,它的作用是如果值为真,就显示这个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> `

v-for
  • 循环
  • 数组循环为了提高循环时性能,在数组其中一项变化后,整个数组不进行全部重新渲染,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>

Demo

<!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,v-bind,v-once
  • 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
  • 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的方法createApp()
  • 创建一个vue应用

const app = Vue.createApp(){}

mount()
  • 挂载到html的dom上

app.mount("#app")

根组件vm
  • 在使用mount()方法时,会返回根组件。返回的是proxy形式的对象
mvvm
  • 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完全销毁之后,会自动执行

vue2和3生命周期函数对比
  • 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>

computed计算属性,watch监听器
  • 方法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>

数据双向绑定v-model
  • 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>

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页