文章目录
- 一、认识Vue.js
- Vue.js介绍
- 引入Vue.js
- hello world示例
- 声明式渲染
- 二、Vue 常用指令
- v-text
- v-html
- v-on
- v-bind
- 绑定超链接
- 绑定Class
- 绑定style
- 指令缩写
- 三、Vue 常用属性
- 数据属性
- 方法
- 计算属性
- 监听属性
- 四、Vue常用指令之流程控制
- v-if
- v-else-fi多分支
- v-show(`推荐`)
- v-for
- 遍历数组
- 遍历字典
- 维护状态
- 选择列表案例:获取用户选择并赋值另一个变量再实时展示
- 五、v-model:双向数据绑定
- 表单输入
- 单选
- 多选框
- 登录案例:获取用户输入的用户名和密码
- 六、实例生命周期钩子
- 参考
一、认识Vue.js
Vue.js介绍
Vue.js(简称Vue) 是一套用于构建用户界面的渐进式前端框架。
Vue.js 核心实现:
• 响应式的数据绑定:当数据发生改变,视图可以自动更新,不用关心DOM操作,而专心数据操作。
• 可组合的视图组件:把视图按照功能切分成若干基本单元,可维护,可重用,可测试等特点。
官网:https://v3.cn.vuejs.org
引入Vue.js
使用Vue的四种方式:
• 在HTML中以CDN包的形式导入
• 下载JS文件保存到本地再导入
• 使用npm安装
• 使用官方VueCli脚手架构建项目(不建议新手直接用)
参考文档:https://v3.cn.vuejs.org/guide/installation.html
hello world示例
创建一个空目录,并用pycharm打开
创建一个html文件
代码内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue Demo</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="hello">
{{ message }} <!--引用变量-->
</div>
<script>
const HelloApp = {
data() {
return {
message: 'hello world', // 定义变量
}
}
}
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
</html>
显示效果
注意:如果不能正常显示变量的值,console控制输出Vue is not defined
的话,需要科学上网才行,因为https://unpkg.com/vue@3/dist/vue.global.js是国外地址
声明式渲染
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统
实现计时器功能:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue Demo</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="counter">
Counter: {{ counter }}
</div>
<script>
const HelloApp = {
data() {
return {
counter: 0, // 定义变量
}
},
mounted() {
setInterval(() => {
this.counter++
},1000) // 单位是ms
}
};
Vue.createApp(HelloApp).mount('#counter') // 创建vue示例和绑定元素
</script>
</body>
</html>
二、Vue 常用指令
指令:带有 v- 前缀的特殊属性。
指令的作用:当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM
v-text
v-text作用与双大花括号作用一样,将数据填充到标签中。但没有闪烁问题!
v-html
某些情况下,从服务端请求的数据本身就是一个HTML代码,如果用双大括号会将数据解释为普通文本,而非HTML代码,为了输出真正的HTML,需要使用v-html指令
<body>
<div id="hello">
<p v-html="message"p></p>
</div>
<script>
const HelloApp = {
data() {
return {
// message: 'hello world', // 定义变量
message: "<span style='color: red'>Hello Vue!!</span>"
}
}
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
v-on
在前端开发中,我们经常监听用户发生的事件,例如点击、拖拽、键盘事件等。
在Vue中如何监听事件呢?使用v-on指令
<body>
<div id="hello">
<p>点击次数:{{ counter }}</p>
<button type="button" v-on:click="counter++">按钮</button>
</div>
<script>
const HelloApp = {
data() {
return {
counter: 0,
}
}
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
v-on: 冒号后面是event参数,例如click、change
v-bind
v-bind:用于动态绑定一个或多个属性值,或者向另一个组件传递props值(这个后面再介绍)
应用场景:图片地址src、超链接href、动态绑定一些类、样式等等
绑定超链接
示例:响应式地更新 HTML 属性
<body>
<div id="hello">
<a v-bind:href="url">百度首页</a>
</div>
<script>
const HelloApp = {
data() {
return {
url: "http://www.baidu.com",
}
}
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
• v-bind 指令后接收一个参数,以冒号分割。
• v-bind 指令将该元素的 href 属性与表达式 url 的值绑定
绑定Class
例如希望动态切换class,为div显示不同背景颜色。
效果:点击按钮,切换不同的背景色
<body>
<div id="hello">
<div v-bind:class="{active: isActive}" class="test"></div>
<button type="button" @click="addStyle">增加样式</button>
</div>
<script>
const HelloApp = {
data() {
return {
isActive: false,
}
},
methods: {
addStyle() {
// 实现动态切换
if(this.isActive) {
this.isActive = false;
} else {
this.isActive = true;
}
}
}
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
绑定style
v-bind:style 的对象语法看着非常像 CSS,但其实是一个JavaScript 对象。CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名。
<body>
<div id="hello">
<div v-bind:style="styleObject" class="test">
Hello World!
</div>
</div>
<script>
const HelloApp = {
data() {
return {
styleObject: {
background: 'orange',
fontSize: 28
}
}
},
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
指令缩写
三、Vue 常用属性
数据属性
组件的 data 选项是一个函数。Vue 会在创建新组件实例的过程中调用此函数。它应该返回一个对象,然后 Vue 会通过响应性系统将其包裹起来,并以 $data 的形式存储在组件实例中。为方便起见,该对象的任何顶级“属性”也会直接通过组件实例暴露出来
方法
方法(methods):处理数据的函数。在methods选项中定义的函数称为方法。
示例:添加方法及调用
在methods选项中定义的方法与data选项中的数据一样,可以在组件的模板中使用。
在模板中,它们通常被当做事件监听使用
计算属性
使用computed:
<body>
<div id="hello">
<span>总分:{{ sum }}</span>
</div>
<script>
const HelloApp = {
data() {
return {
math: 80,
english: 90
}
},
computed: {
sum: function () {
return this.math + this.english
}
}
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
小结:计算属性一般用来通过其他的数据算出一个新数据,而且它有一个好处就是,它把新的数据缓存下来了,当其他的依赖数据没有发生改变,它调用的是缓存的数据,这就极大的提高了我们程序的性能。
而如果写在methods里,数据根本没有缓存的概念,所以每次都会重新计算。这也是为什么不用methods的原因!
监听属性
是一个观察动作,监听data数据变化后触发对应函数,函数有newValue(变化之后结果)和oldValue(变化之前结果)两个参数。
当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。
四、Vue常用指令之流程控制
v-if
通过boolean的值来控制显示的内容
<body>
<div id="hello">
<p v-if="boolean">显示</p>
<p v-else>不显示</p>
</div>
<script>
const HelloApp = {
data() {
return {
boolean: false
}
},
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
v-if指令必须将它添加到一个元素上,如果想控制多个元素该怎么操作呢?
可以将要控制的元素放到<template>里面,并在上面使用v-if。最终的渲染结果将不包含<template>元素。
<body>
<div id="hello">
<template v-if="boolean"
<h1>标题</h1>
<p>第一个段落</p>
</template>
</div>
<script>
const HelloApp = {
data() {
return {
boolean: false
}
},
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
v-else-fi多分支
v-show(推荐
)
另一个用于条件性展示元素的指令,与v-if不同的是,v-show的元素始终会被渲染并保留再DOM中,所以v-show只是简单地切换元素的display CSS属性
使用v-if,值为false,F12查看,元素未保留
使用v-show,值为false,F12查看元素,元素保留,display的值为none
v-for
可以用 v-for 指令基于一个数组来渲染一个列表。
需要使用 item in items 形式,其中 items 是数组名,而 item 则是数组元素的别名。
遍历数组
<body>
<div id="hello">
<ul>
<li v-for="(value, index) in hostArray">
{{ index }} - {{ value }}
</li>
</ul>
</div>
<script>
const HelloApp = {
data() {
return {
hostArray: [
'192.168.1.2',
'192.168.1.3',
'192.168.1.4'
]
}
},
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
遍历字典
<body>
<div id="hello">
<ul>
<li v-for="(v, k) in hostObject" :key="k">
{{ k }} - {{ v }}
</li>
</ul>
</div>
<script>
const HelloApp = {
data() {
return {
hostObject: {
'db': '192.168.1.2',
'jenkins': '192.168.1.3',
'nginx': '192.168.1.4'
}
}
},
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
维护状态
- 当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”策略。
- 如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个
- 元素,并且确保它们在每个索引位置正确渲染。
为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你
需要为每项提供一个唯一的 key 属性:
选择列表案例:获取用户选择并赋值另一个变量再实时展示
<body>
<div id="hello">
<select @change="selectHost($event)"> <!-- $event可以获取事件的值-->
<option value="None">未选择</option>
<option v-for="host in hostArray" :value="host.id" :key="host.id">
{{ host.name }}
</option>
</select>
<p>当前选择的主机ID:{{ selectHostId }}</p>
</div>
<script>
const HelloApp = {
data() {
return {
hostArray: [
{'id':1, 'name': '主机1'},
{'id':2, 'name': '主机2'},
{'id':3, 'name': '主机3'},
],
selectHostId: '',
}
},
methods: {
selectHost(event) {
console.log(event) // 打印事件的值
this.selectHostId = event.target.value
if (this.selectHostId == "None") {
this.selectHostId = "未选择"
}
}
}
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
五、v-model:双向数据绑定
Vue是数据驱动的,数据驱动有一个精髓之处是数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。
表单输入
v-model指令提供表单输入绑定,可以在 <input>、<textarea> 及 <select> 元素上创建双向数据绑定
<body>
<div id="hello">
<input type="text" v-model="msg">
<p>{{ msg }}</p>
</div>
<script>
const HelloApp = {
data() {
return {
msg: 'Hello World!',
}
},
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
输入框输入的内容同步在下面显示
v-model指令其实是一个语法糖,背后本质上包含v-bind和v-on两个操作
单选
<body>
<div id="hello">
<input type="radio" name="go" value="Go" v-model="msg">GO <br>
<input type="radio" name="vue" value="Vue" v-model="msg">Vue <br>
<p>当前选择:{{ msg }}</p>
</div>
<script>
const HelloApp = {
data() {
return {
msg: '',
}
},
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
多选框
<body>
<div id="hello">
<select multiple v-model="selected">
<option value="python">python</option>
<option value="java">java</option>
<option value="html">html</option>
</select>
<p>当前选择:{{ selected }}</p>
</div>
<script>
const HelloApp = {
data() {
return {
selected: '',
}
},
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
登录案例:获取用户输入的用户名和密码
<body>
<div id="hello">
<h1>运维管理后台</h1>
用户名: <input type="text" v-model="form.username"> <br>
密码: <input type="text" v-model="form.password"> <br>
<button @click="loginBtn">登录</button>
<p style="color: red" v-if="notice">用户名或者密码不能为空!</p>
</div>
<script>
const HelloApp = {
data() {
return {
form: {
username: '',
password: ''
},
notice: false
}
},
methods: {
loginBtn() {
if (this.form.username == '' || this.form.password == '') {
this.notice = true
} else {
this.notice = false
console.log(this.form)
}
}
}
};
Vue.createApp(HelloApp).mount('#hello') // 创建vue示例和绑定元素
</script>
</body>
六、实例生命周期钩子
生命周期是指Vue实例从创建到销毁的过程。就是vue实例从开始创建、初始化数据、编译模板、挂载Dom、渲染->更新->渲染、卸载等⼀系列过程,在vue⽣命周期中提供了⼀系列的⽣命周期函数,如图所⽰