vue基础知识 vue基础知识面试题
bigegpt 2024-10-11 10:55 8 浏览
基础认识
变量
- 模板中使用变量用 {{}},也叫字面量或者插值表达式
数组
- 类似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>
相关推荐
- 当Frida来“敲”门(frida是什么)
-
0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...
- 服务端性能测试实战3-性能测试脚本开发
-
前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...
- Springboot整合Apache Ftpserver拓展功能及业务讲解(三)
-
今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...
- Linux和Windows下:Python Crypto模块安装方式区别
-
一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...
- Python 3 加密简介(python des加密解密)
-
Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...
- 怎样从零开始编译一个魔兽世界开源服务端Windows
-
第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...
- 附1-Conda部署安装及基本使用(conda安装教程)
-
Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...
- 如何配置全世界最小的 MySQL 服务器
-
配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...
- 如何使用Github Action来自动化编译PolarDB-PG数据库
-
随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...
- 面向NDK开发者的Android 7.0变更(ndk android.mk)
-
订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...
- 信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要
-
问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...
- OpenSSH 安全漏洞,修补操作一手掌握
-
1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...
- Linux:lsof命令详解(linux lsof命令详解)
-
介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...
- 幻隐说固态第一期:固态硬盘接口类别
-
前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...
- 新品轰炸 影驰SSD多款产品登Computex
-
分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...
- 一周热门
- 最近发表
-
- 当Frida来“敲”门(frida是什么)
- 服务端性能测试实战3-性能测试脚本开发
- Springboot整合Apache Ftpserver拓展功能及业务讲解(三)
- Linux和Windows下:Python Crypto模块安装方式区别
- Python 3 加密简介(python des加密解密)
- 怎样从零开始编译一个魔兽世界开源服务端Windows
- 附1-Conda部署安装及基本使用(conda安装教程)
- 如何配置全世界最小的 MySQL 服务器
- 如何使用Github Action来自动化编译PolarDB-PG数据库
- 面向NDK开发者的Android 7.0变更(ndk android.mk)
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)