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有所帮助。如果觉得本文对你有所帮助,不妨给笔者点个赞再走。

相关推荐
战族狼魂1 分钟前
基于TypeScript+React+AntDesign 的车辆车型管理页面
javascript·react.js·typescript
曹天骄3 分钟前
使用 React useEffect 实现条件判断的最佳实践
前端·react.js·前端框架
想做一只快乐的修狗4 分钟前
【React】react hooks的使用规则
前端·react.js·前端框架
BHDDGT7 分钟前
react-问卷星项目(2)
前端·react.js·前端框架
Teln_小凯8 分钟前
nodejs - puppeteer 无头浏览器截图 JAVA后端调用
java·前端·python
理想青年宁兴星12 分钟前
vue中异步批量删除列表数据
前端·javascript·vue.js
勿语&12 分钟前
侧边菜单的展开和折叠
javascript·vue.js
可别是个可爱鬼16 分钟前
黑马智数Day3
前端·javascript·html
xcLeigh1 小时前
HTML5实现唐朝服饰网站模板源码
前端·html·html5
我很苦涩的1 小时前
解决json格式转换被特殊字符截断问题
javascript·json