vue常见指令分享

vue是国内主流的JavaScript框架,今天我们就从小白的角度带大家认识下vue,以及它的一些常见指令。

Vue体验

一个情景:我们想要在列表中赋值内容,实际项目开发的时候我们必然不能在前端写死,我们需要在js中获取dom结构,把html搬动js中,是像下面这样去写代码的,这是传统原生js写法

xml 复制代码
    <div id="app"></div>
        
    <script>
        let app = document.getElementById("app")
        let h2 = document.createElement("h2")
        h2.innerHTML = "Hello world"
        app.appendChild(h2)
    </script>

我们现在采用vue的写法

首先我们需要导入vue的源码库,点击下面的链接,寻找cdn导入

快速上手 | Vue.js (vuejs.org)

xml 复制代码
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

cdn导入就有点像jquery引用库

xml 复制代码
    <div id="app"></div>
       
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        const msg = '你好'
        const tel = {
            template: `<h1>${msg}</h1>`
        }
        const app = Vue.createApp(tel)
        app.mount('#app')
    </script>

你可以这样理解,Vue就是上面链接导入进来的一个构造函数,这个构造函数里面封装了许多方法,其中createApp就相当于一个new。然后app其实就是被创建了的一个Vue项目。mount是挂载的意思,获取到人家的dom结构,其实这个写法是比较原始的,我们再来看一个新写法:

xml 复制代码
    <div id="app">
        你好
    </div>
    <script type="x-template" id="template">
        <div>
            <h1>{{message}}</h1>
        </div>
    </script>

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        document.getElementById("template")
        Vue.createApp({
            template: '#template',
            data: function() {
                return {
                    message: '哈哈哈哈哈哈哈哈哈'
                }
            }
        }).mount('#app')
	</script>

div下面的js代码就是用于表达上面的html代码,这段js会被当成一个模板。用vue的好处就往html塞值很方便。这里需要注意,Vue.createApp里面是一个对象,其key的名称都是固定的,data是数据源,里面返回的key的名称你可以随意取。

其实你这里还是会发现,这样写代码好像也不优雅,因为敲字符串模板代码的时候没有任何代码提示。确实!其实这个方法我们也不用,我们现在用得是下面这个方法!

xml 复制代码
    <div id="app"></div>
    <template id="tel">
        <div>
            <h2>你好  {{message}}</h2>
            <h2>{{count}}</h2>
            <button @click="add">+1</button>
            <button @click="minus">-1</button>
        </div>
    </template>

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        Vue.createApp({
            template: '#tel',
            data: function () {
                return {
                    message: '小黑子',
                    count: 1
                }
            },
            methods: {
                add: function() {
                    this.count ++
                    console.log(this);
                minus() {
                    this.count --
                }
            }
        }).mount('#app')
    </script>

template标签是html5的一个标签,他是一个文档碎片,不用来展示。不过你在里面写html代码时,可以挖坑(指的是放变量{{}}),写html代码也能够有提示

这里也简单写了个按钮,实现++和--功能,methods是函数源 ,这里值得注意的是,函数不要写成箭头函数,否则this代表全局

Vue指令

v-text

v-text不需要用{{}}

less 复制代码
<div v-text="msg"></div>
// 等同于
<div>{{msg}}</div>

v-html

就相当于在后端写html,该指令可以渲染出开闭标签的效果

xml 复制代码
<div v-html="info"></div>
// info: '<h1>这是一个副文本</h1>'

v-once

将变量封印掉,不会再变化

less 复制代码
<h1 v-once>{{count}}</h1>
<h1>{{count}}</h1>
<button @click="add">+1</button>
// add在methods中定义好了,this.count ++

第一个h1标签的值被once封印掉了,不会发生变化

v-pre

告诉vue,这里不需要被识别成字符串,直接给你把内容输出出来

其实template模板就是一个字符串,被vue转成dom结构,并且读取变量值,这过程就是vue的编译,然后再挂载在html上进行渲染。

less 复制代码
<h1 v-pre>{{message}}</h1>
// 打印出 {{message}}

v-cloak

隐藏还没编译完成的dom结构。如果代码量很多,编译很久才能看到效果,有了v-cloak没有编译完是不会出现内容的,dom结构生成了,但是值是看不到的

xml 复制代码
<style>
	[v-cloak]{
		display: none;
	}
</style>
<body>
	<h1 v-cloak>{{message}}<h1>
</body>

v-model

通常用在input框中,实现内容双向绑定

typescript 复制代码
账号:<input type="text" v-model="account"> 

data(){
	return {
		account: 'admin'
	}
}

account的值根据你输入或者数据源的值变化而变化

v-bind

on和bind是用的最多的指令。v-bind动态绑定一个或多个属性。

v-bind绑定标签

让你可以在html标签身上绑定某个属性,靠v-bind申明,这是个变量,而非字符串

使用示例:

xml 复制代码
<template id="my-app">
	<img v-bind:src="imgUrl" alt="">
	<a :href="link">百度一下</a>
</template>

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        const App = {
            template: '#my-app',
            data() {
                return {
                    imgUrl: 'https://tse4-mm.cn.bing.net/th/id/OIP-C.rRft2FXf66GvFthFd4OuewAAAA?w=220&h=220&c=7&r=0&o=5&dpr=1.3&pid=1.7',
                    link: 'https://www.baidu.com'
                }
            }
        }
        Vue.createApp(App).mount('#app')
    </script>

前端工程师不能决定这里放什么图片,不能写死链接,因此我们用上bind,v-bind会去数据源里面找变量返回,你不用bind,imgUrl就是一个字符串,而非变量 。当然v-bind一直这样敲会很累。这里提供一个语法糖,简约写法::href一样管用

v-bind绑定类名

项目开发用得非常多,动态绑定类名

项目开发中类名有时候也不是固定的,因此我们用上bind绑定类名

javascript 复制代码
<template id="my-app">
	<div :class="['Fung', {'active': isActive}]">海豚</div>
</template>

data(){
	return {
		isActive: true
	}
}

这里我们放了一个数组,第二个类名由它的值决定显示与否

我们还可以放一个对象,函数🌰

javascript 复制代码
<div class='Fung' :class="{'active': isActive, 'title': ture}">海豚</div>
<div :class="getClass()">dolphin</div>

data(){
	return {
		isActive: true
	}
},
method: {
	getClass() {
		return 'string'
	}
}

动态绑定类名方法很多,场景适合哪个就用那种

v-bind绑定style

javascript 复制代码
<template id="my-app">
	<div :style="{color: fontColor, fontSize: fontSize}">海豚</div>
<template>

data(){
	return {
		fontColor: 'blue',
		fontSize: '50px'
	}
}

这里注意,vue作者给我们封装成了-就用驼峰的形式写样式,比如font-size写成fontSize。

当然我们也可以用对象或者数组来存储样式

css 复制代码
<div :style="[styleObj1, styleObj2]">海豚</div>

data(){
	return {
		styleObj1: {
			color: 'green'
		},
		styleObj2: {
			fontSize: '40px'
		}
	}
}

v-on

v-on用于绑定事件

比如我们给一个div盒子,鼠标移入盒子范围内触发打印事件

javascript 复制代码
<div v-on:mouseenter='enter' style="width: 100px; height: 100px; border: 1px solid black;"></div>

methods: {
	enter(){
		console.log('鼠标移入')
	}
}

函数调用不需要我们自己写(),如果有参数就要用(),如果参数有事件参数event就在前面加一个$符号,否则会被覆盖掉

scss 复制代码
<button @click="handleClick($event, 'ikun', 18)">按钮</button>
methods: {
	handleClick(e, name, age){
		console.log(e, name, age)
	}
}

如果不用$,会输出name,age,undefined。

v-if

用例如下

javascript 复制代码
<template id="my-app">
        <h2 v-if="count == 1">hello world</h2>
        <h2 v-else-if="count == 2">こんにちは</h2>
        <h2 v-else>你好 世界</h2>
        <button @click="change">切换</button>
</template>

data(){
	return {
		count: 0
	}
},
methods: {
	change(){
		this.count++
		if(this.count > 2){
			this.count = 0
		}
	}
}

这里简单地实现了一个语言切换的效果,v-if,v-else必须要在相同的同级结构下,不能写出去

v-show

v-show在css层面添加了display: none,但是与display: none不同的是,v-show不会加载dom结构,所以面对需要频繁消失出现的dom结构,我们用v-show效率会很高,但是v-show的控制权限不好,用权限控制的结构就不能用v-show

用例如下🌰:

javascript 复制代码
<template id="my-app">
        <h2 v-show="isShow">hello World</h2>
        <button @click="change">切换</button>
</template>

data(){
	return {
		isShow: true
	}
},
methods: {
	change(){
		this.isShow = !this.isShow
	}
}

v-for

注意:现在vue的最新版本是不允许v-for和v-if一起出现的 :因为for让他出现,if不让他出现,性能会大打折扣。考虑性能问题,v-for和v-bind一起使用性能会更高

实现一个展现歌曲列表,并且进行删除的功能

xml 复制代码
    <div id="app"></div>
    <template id="my-app">
        <h2>歌曲列表</h2>
        <ul>
            <li v-for="(item, index) in songs" :key="index">
                第{{index + 1}}首:{{item}}
                <a href="#" @click="del(index)">x</a>
            </li>
        </ul>
    </template>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        const App = {
            template: '#my-app',
            data(){
                return {
                    songs: [
                        '爷爷泡的茶',
                        '红尘客栈',
                        '烟花易冷'
                    ]
                }
            },
            methods: {
                del(i){
                    this.songs.splice(i, 1)
                }
            }
        }
        Vue.createApp(App).mount('#app')
    </script>

computed

计算属性的函数名直接充当调用,从效果上来说,与在methods封装,没有区别

给到你一个场景:升高温度更换衣服

xml 复制代码
    <div id="app"></div>
    <template id="my-app">
        <h2>今天温度{{temp}}°</h2>
        <h3>建议穿:{{suggestion}}</h3>
        <button @click="add">+5°</button>
        <button @click="minus">-5°</button>
    </template>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

    <script>
        const App = {
            template: '#my-app',
            data() {
                return {
                    temp: 10
                }
            },
            computed: {
                suggestion(){
                    let res = '夹克'
                    if(this.temp >= 25){
                        res = '短袖'
                    }else if(this.temp <= 0){
                        res = '羽绒服'
                    }else{
                        res = '夹克'
                    }
                    return res
                }
            },
            methods: {
                add(){
                    this.temp += 5
                },
                minus(){
                    this.temp -= 5
                }
            }
        }
        Vue.createApp(App).mount('#app')
    </script>

这里是响应式执行,当他依赖的数据源发生变更时就会执行,计算属性中的函数发生变更就会执行,别的值变更不会

methods和computed区别

xml 复制代码
<div id="app"></div>
    <template id="my-app">
        <button @click="change">修改姓名</button>
        <h2>computed:{{fullName}}</h2>
        <h2>computed:{{fullName}}</h2>
        <!-- hr是html4的标签,不建议使用了,这里仅仅为了简单做个区分 -->
        <hr>
        <h2>methods:  {{getFullName()}}</h2>
        <h2>methods:  {{getFullName()}}</h2>
    </template>

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        const App = {
            template: '#my-app',
            data() {
                return {
                    firstName: 'Dolphin',
                    lastName: 'Fung'
                }  
            },
            methods: {
                getFullName(){
                    console.log('methods中getFullName执行了')
                    return this.firstName + ' ' + this.lastName
                },
                change(){
                    this.firstName = 'Parker'
                }
            },
            computed: {
                fullName(){
                    console.log('computed执行了')
                    return this.firstName + ' ' + this.lastName
                }
            }
        }
        Vue.createApp(App).mount('#app')
    </script>

你拿这段代码运行就会发现,computed只会打印一次

这是因为:计算属性是有缓存的,多次使用计算属性的逻辑的时候只会执行一次,而methods没有

watch监听器

vue的一大magic

同样拿到上面的更衣栗子🌰:

xml 复制代码
<div id="app"></div>
    <template id="my-app">
        <h2>今天温度{{temp}}°</h2>
        <h3>建议穿:{{suggestion}}</h3>
        <button @click="add">+5°</button>
        <button @click="minus">-5°</button>
    </template>

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

    <script>
        const App = {
            template: '#my-app',
            data() {
                return {
                    // 如果这里的温度也不能写死
                    temp: -5,
                    suggestion: '夹克'
                }
            },
            watch: {
                temp: {
                    handler: function(newVal, oldVal){
                        if(this.temp >= 25){
                            this.suggestion = '短袖'
                        }else if(this.temp <= 0){
                            this.suggestion = '羽绒服'
                        }else{
                            this.suggestion = '夹克'
                        }

                    },
                    immediate: true
                }
            },
            methods: {
                add(){
                    this.temp += 5
                },
                minus(){
                    this.temp -= 5
                }
            }
        }
        Vue.createApp(App).mount('#app')
    </script>

和computed非常相似,区别在于,watch在刚进页面的时候让你先执行一次,这个例子中初始就会显示羽绒服。

写在最后

vue的指令还是比较多的,当你记不住的时候就可以去官网查看。当然你也可以收藏本篇文章,希望对你学习vue有所帮助。如果觉得本文对你有所帮助,不妨给笔者点个赞再走。

相关推荐
agenIT几秒前
micro-app前端微服务原理解析
前端·微服务·架构
小宁爱Python18 分钟前
深入理解CSS显示模式与盒子模型
前端·css
淘源码d25 分钟前
一套SaaS ERP管理系统源码,支持项目二开商用,SpringBoot+Vue+ElementUI+UniAPP
vue.js·spring boot·elementui·erp·erp系统·erp源码
只可远观32 分钟前
Git 忽略文件配置 .gitignore
android·前端·git
向上的车轮1 小时前
JavaScript的3D库有哪些?
开发语言·javascript·3d
我是大头鸟1 小时前
SpringMVC 通过ajax 前后端数据交互
前端·javascript·ajax
北观止1 小时前
批量删除OpenStack实例
linux·前端·chrome·openstack
爱笑的眼睛112 小时前
React Native 入门 jsx tsx 基础语法
javascript·react native·react.js
BillKu2 小时前
Vue3中AbortController取消请求的用法详解
前端·javascript·vue.js
heroboyluck3 小时前
rust 全栈应用框架dioxus
前端·rust·dioxus