一、概述
Vue3 的语法格式有2中,一种为选项式,一种为组合式。
选项式和vue2的语法格式相同,更加适用于初学者。
组合式为vue3的新特性,更加适用于项目中,能够增加代码的可读性、复用性。
本章内容使用的是选项式。
二、常用指令
2.1、简介
Vue.js 是一个构建用户界面的 JavaScript 框架。在javascript中定义数据内容,通过vue框架中的指令将数据渲染到页面之上。
Vue的常用指令有以下几个:
v-bind:绑定数据到 HTML 元素的属性。
v-if:根据表达式的值的真假来决定是否渲染元素。
v-for:循环渲染一个数组中的项目。
v-on:监听 DOM 事件并执行一个表达式。
v-model:双向绑定数据到表单输入元素。除了这几个指令以外,还有以下几个不太常用的指令
v-show、v-html、v-text
这些指令是 Vue.js 的核心功能,它们可以帮助你在模板中绑定数据、控制元素的显示和隐藏、遍历数组并执行事件处理。
2.2、VUE基础入门
在vue中定义的数据如何简单的显示在页面之上?
在vue中可以使用{{属性名}}的方式将数据展示浏览器之上
实现步骤:
1.在js中定义数据
2.在 中通过 {{}} 显示js中定义的数据
Test.vue
<script>
// export:es6中的写法,导出当前的js代码,可以在其他的页面/js中导入当前的js代码,并使用
export default {
// data为vue中的属性,在次属性中定义要在template中展示的数据,data需要函数化!!!
data() {
// 在 return 中定义vue中的数据,可以加载 JSON 数据格式的内容.
return {
message: "我是vue中定义的一个数据哟"
};
},
// methods为vue中的属性,用于定义vue中的函数
methods:{
show(){
alert("我是show");
}
}
}
</script>
<template>
<!-- template中可以添加多个子标签,但是推荐大家将内容放在一个div标签中! -->
<div>
<!-- 在template中任意一个位置都能显示data中的数据 -->
{{ message }}
<!-- 也可以将message显示在其他标签中 -->
<p>
{{ message }}
</p>
<!-- 调用函数 -->
{{ show() }}
</div>
</template>
<style scoped>
</style>
App.vue
<script setup lang="ts">
// 导入Test.vue 文件
import Test from './views/Test.vue'
</script>
<template>
// 以子组件的方式加Test.vue文件中的内容
<Test></Test>
</template>
<style scoped>
header {
line-height: 1.5;
max-height: 100vh;
}
.logo {
display: block;
margin: 0 auto 2rem;
}
nav {
width: 100%;
font-size: 12px;
text-align: center;
margin-top: 2rem;
}
nav a.router-link-exact-active {
color: var(--color-text);
}
nav a.router-link-exact-active:hover {
background-color: transparent;
}
nav a {
display: inline-block;
padding: 0 1rem;
border-left: 1px solid var(--color-border);
}
nav a:first-of-type {
border: 0;
}
@media (min-width: 1024px) {
header {
display: flex;
place-items: center;
padding-right: calc(var(--section-gap) / 2);
}
.logo {
margin: 0 2rem 0 0;
}
header .wrapper {
display: flex;
place-items: flex-start;
flex-wrap: wrap;
}
nav {
text-align: left;
margin-left: -1rem;
font-size: 1rem;
padding: 1rem 0;
margin-top: 1rem;
}
}
</style>
2.3、v-html和v-text
v-html:将js中定义的数据以HTML内容的方式加载到浏览器之上。
v-text:以文本的方式加载js中的数据,和 {{}} 加载数据是一样的效果
Test.vue
<script>
export default {
// data为vue中的属性,在次属性中定义要在template中展示的数据,data需要函数化!!!
data() {
return {
test: "<a href='http://www.baidu.com'>百度</a>"
};
}
}
</script>
<template>
<!-- template中可以添加多个子标签,但是推荐大家将内容放在一个div标签中! -->
<div>
<!-- vue的指令需要设置在标签之上 -->
<!-- v-html:<标签名 v-html="在js中定义的属性名">,如果test中有标签,test中的标签内容以标签的方式加载 -->
<p v-html="test"></p>
<!-- v-text:<标签名 v-text="在js中定义的属性名">,如果test中有标签,test中的标签内容以文本的方式加载 -->
<p v-text="test"></p>
</div>
</template>
<style scoped>
</style>
2.4、v-show和v-if
v-show:通过标签的display样式属性设置标签是否显示在浏览器之上
v-if:通过表达式控制标签是否加载到浏览器之上
Test.vue
<script>
export default {
// data为vue中的属性,在次属性中定义要在template中展示的数据,data需要函数化!!!
data() {
return {
age: 18
};
}
}
</script>
<template>
<!-- template中可以添加多个子标签,但是推荐大家将内容放在一个div标签中! -->
<div>
<!--
v-if:通过表达式放回的结果决定当前标签是否加载到浏览器
一个v-if之后能跟多个 v-else-if,只能加一个v-else
v-else-if和v-else都不能单独出现
-->
<p v-if="age<18">未成年</p>
<p v-else-if="age<25">青年</p>
<p v-else-if="age<35">中年</p>
<p v-else-if="age<45">壮年</p>
<p v-else-if="age<80">老年</p>
<p v-else>大寿星啊~~</p>
</div>
</template>
<style scoped>
</style>
Test.vue
<script>
export default {
// data为vue中的属性,在次属性中定义要在template中展示的数据,data需要函数化!!!
data() {
return {
age: 18
};
}
}
</script>
<template>
<!-- template中可以添加多个子标签,但是推荐大家将内容放在一个div标签中! -->
<div>
<p v-show="age>18">我是v-show</p>
<p v-show="age<=18">我是v-show</p>
</div>
</template>
<style scoped>
</style>
2.4、v-for 列表指令
v-for:循环加载数据到浏览器之上
<script>
export default {
// data为vue中的属性,在次属性中定义要在template中展示的数据,data需要函数化!!!
data() {
return {
number: 10,
userObject: {
userName: "小明",
userAge: 15,
userSex: 0
},
userArray: [{
userName: "小明",
userAge: 15,
userSex: 0
}, {
userName: "小红",
userAge: 15,
userSex: 0
}, {
userName: "小兰",
userAge: 15,
userSex: 1
}]
};
}
}
</script>
<template>
<!-- template中可以添加多个子标签,但是推荐大家将内容放在一个div标签中! -->
<div>
<!--
固定次数的循环
i为循环变量,用于接收循环过程中的临时数据
in为关键字
number为vue data属性中的数据
-->
<p v-for="i in number">
<!-- 将i显示在浏览器之上 -->
{{ i }}
</p>
<!--
循环对象
value:对象中属性的值
kay:对象中的属性名
userObject:在vue data 中声明的对象
-->
<p v-for="(value,key) in userObject">
{{ key }}-->{{ value }}
</p>
<!--
循环数组
user:存储数组中的元素对象,对象名自定义
user.属性名:获取数组中的元素对象的属性,属性名需要和数组中的对象属性名相同!!!
-->
<p v-for="user in userArray">
<!-- user:为userArray中的对象 -->
{{ user }}
姓名:{{ user.userName }} 年龄:{{ user.userAge }} 性别:{{ user.userSex == 1 ? "男" : "女" }}
</p>
</div>
</template>
<style scoped>
</style>
2.5、v-bind 属性绑定
将vue data中的数据以标签属性的方式加载到浏览器中。
<script>
export default {
// data为vue中的属性,在次属性中定义要在template中展示的数据,data需要函数化!!!
data() {
return {
imagePath: "./src/assets/img/1.png",
widths: "200",
title: "vue 3.0",
imagePath2: "https://www.xgccm.com/kindeditor/attached/image/20200310/20200310164388978897.jpg",
styleText: "red",
fontSize: "24px",
styleObject: {
color: "pink",
"font-size": "36px"
},
styleObject2: {
"margin-left": "10px"
},
classAFlag: true,
fontAFlag: true,
classObject: {
colorA: true,
fontA: true
},
bgObjct: {
bg: true
},
classArray: [{
"bg": true
}, {
"fontA": true
}]
};
}
}
</script>
<template>
<!-- template中可以添加多个子标签,但是推荐大家将内容放在一个div标签中! -->
<div>
<!-- vue3中动态加载静态图片【存在assets文件夹】中的图片路径需要从src目录开始 -->
<img v-bind:src="imagePath" v-bind:width="widths" v-bind:title="title"/>
<!-- vue3加载远程图片 -->
<img v-bind:src="imagePath2" v-bind:width="widths">
<!-- 设置动态样式【通过style属性进行设置】 -->
<p :style="{color:styleText,'font-size':fontSize}">颜色</p>
<p :style="styleObject">obj</p>
<p :style="[styleObject,styleObject2]">Array</p>
<!-- 设置动态样式【通过class样式表进行设置】 -->
<p :class="{colorA:classAFlag,fontA:fontAFlag}">哈哈哈</p>
<p :class="classObject">class-obj</p>
<p :class="classArray">array</p>
<p :class="[classObject,bgObjct]">array2</p>
</div>
</template>
<style scoped>
.colorA {
color: red;
}
.fontA {
font-size: 30px;
}
.bg {
background-color: papayawhip;
}
</style>
2.6、v-model 双向绑定
如果需要获取到表单元素中的数据,在Vue 中可以使用v-model,将vue data 中的数据和表单元素的value属性进行双向绑定,当表单元素的value值改变之后,vue data 中的数据会同时变化。反之亦然。
<script>
export default {
// data为vue中的属性,在次属性中定义要在template中展示的数据,data需要函数化!!!
data() {
return {
userName: "小白",
hobby: ["吃饭"],
picked: "One"
};
}
}
</script>
<template>
<!-- template中可以添加多个子标签,但是推荐大家将内容放在一个div标签中! -->
<div>
{{ userName }} {{ hobby }} {{ picked }}
<br>
<input type="text" v-model="userName"/><br/>
<!-- 多个复选框/单按钮 为一组,那么这几个表单元素的v-model的属性名要相同 -->
<input type="checkbox" value="吃饭" v-model="hobby"/>吃饭
<input type="checkbox" value="睡觉" v-model="hobby"/>睡觉
<input type="checkbox" value="打豆豆" v-model="hobby"/>打豆豆<br/>
<input type="radio" id="one" value="One" v-model="picked"/>
<label for="one">One</label>
<input type="radio" id="two" value="Two" v-model="picked"/>
<label for="two">Two</label>
</div>
</template>
<style scoped>
</style>
2.7、v-on 事件绑定
v-on用于完成事件绑定
<script>
export default {
// data为vue中的属性,在次属性中定义要在template中展示的数据,data需要函数化!!!
data() {
return {
count: 1,
message: ""
}
}, methods: {
show(text) {
console.log(text)
},
getTitle() {
return "title哦";
}
}
}
</script>
<template>
<!-- template中可以添加多个子标签,但是推荐大家将内容放在一个div标签中! -->
<div>
{{ count }}
<button @click="count++">count</button>
<br>
<!-- prevent:阻止本身的行为 -->
<a @click.prevent="show('我是小新呀')" href="#">单击事件</a><br>
<!-- 设置返回值赋值给属性 -->
<a :title="getTitle()" herf="#">信息</a>
</div>
</template>
<style scoped>
</style>
三、综合案例
通过Vue的指令,来完成对数据的增删改查
<script>
export default {
// data为vue中的属性,在次属性中定义要在template中展示的数据,data需要函数化!!!
data() {
return {
user: {
userName: "小李",
age: 16,
sex: "男"
},
users: [{
userName: "小王",
age: 16,
sex: "男"
}, {
userName: "小张",
age: 16,
sex: "男"
}, {
userName: "小刘",
age: 16,
sex: "女"
}]
}
}, methods: {
save: function () {
// 添加
this.users.push({
userName: this.user.userName,
age: this.user.age,
sex: this.user.sex
});
},
edit: function (index) { // index:tr的下标
// 修改
this.users.splice(index, 1, this.user);
alert("修改成功");
},
remove: function (index) {
// 删除
this.users.splice(index, 1);
}
}
}
</script>
<template>
<!-- template中可以添加多个子标签,但是推荐大家将内容放在一个div标签中! -->
<div>
姓名:<input type="text" name="username" v-model="user.userName"/><br/>
年龄:<input type="text" name="username" v-model="user.age"/><br/>
性别:<input type="radio" name="sex" v-model="user.sex" value="男"/> 男
<input type="radio" name="sex" v-model="user.sex" value="女"/> 女<br/>
<input type="button" value="保存" @click="save"/>
<br/>
<table>
<tr>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>操作</td>
</tr>
<tr v-for="(user,index) in users">
<td>{{ user.userName }}</td>
<td>{{ user.age }}</td>
<td>{{ user.sex }}</td>
<td>
<input type="button" value="修改" @click="edit(index)"/>
<input type="button" value="删除" @click="remove(index)"/>
</td>
</tr>
</table>
</div>
</template>
<style scoped>
</style>
四、总结
Vue3 的基本指令包括 v-bind、v-if、v-for、v-on 和 v-model。它们可以帮助我们在模板中绑定数据、控制元素的显示和隐藏、遍历数组并执行事件处理,实现双向绑定。通过学习和使用这些指令,我们可以在 Vue.js 中快速开发出功能丰富的用户界面。