编程教育资源分享平台

网站首页 > 后端开发 正文

vue基础知识

luoriw 2024-01-31 12:30:03 后端开发 11 ℃ 0 评论

基础认识

变量

  • 模板中使用变量用 {{}},也叫字面量或者插值表达式

数组

  • 类似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>

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表
最新留言