赞
踩
Vue2 是一个相当经典的版本,4 年间一共经历了 70 多次的版本更新,实际开发中 Vue2 依然用的很多。从 Vue2 这个经典版本入门,等熟练掌握之后,再去学习 Vue3 .
Vue 官网定义:Vue 是一套用于构建用户界面的渐进式 JavaScript 框架
构建用户界面:将数据通过某种办法变成用户可以看见的界面(前端开发工程师的职责:在合适的时候发出合适的请求,最后将数据展示到合适的位置)。 Vue 并不关心怎么得到数据(发送请求、模拟数据或者是死数据),Vue 只关心在得到数据之后如何将它变成界面
渐进式:所谓的渐进式是指 Vue 可以自底向上逐层应用。如果应用比较简单,那么只需要一个轻量小巧的核心库(压缩完之后只有 100kb 左右), 如果是一个比较复杂的应用,则可以引入各式各样的 Vue 插件。
谁开发的?---- 尤雨溪(Evan You)
Vue的特点(1)采用组件化模式,提高代码复用率、且让代码更好维护。
在 Vue 中,一个 .vue 文件就是一个组件。
Vue包含了 html 结构、css 样式以及 js 交互。
提高代码的复用率:只需要引入 .vue 文件,就能够实现和原先相同的功能
代码更好维护:组件化的设计使得对某一组件的修改不会影响到其他组件
的正常运行(封装)
(2)声明式编码,让编码人员无需直接操作 DOM ,提高开发效率
命令式编码:按照指定的步骤执行,缺一不可
(3)使用虚拟 DOM +优秀的 Diff 算法,尽量复用 DOM 节点
虚拟 DOM 就是内存中的数据
对于新增的数据,Vue 会将新的虚拟 DOM 和旧的虚拟 DOM 进行比较( Diff 算法),将相同的部分直接进行复用
Vue模板语法包括两大类:
功能:用于解析标签体内容
写法: {{xxx}},xxx 是js 表达式,可以直接读取到 data 中的所有区域
功能:用于解析标签(包括:标签属性、标签体内容、绑定事件.)
举例:<a v-bind:href="xxx">或简写为<a :href="xxx">,xxx 同样要写js 表达式,可以直接读取到 data 中的所有属性
备注:Vue 中有很多的指令,且形式都是v-xxx,此处只是拿 v-bind 举例
- <template>
- <div class="twoPage">
- <!-- 模板语法:-->
-
- <h1>第二章 模板语法</h1>
- <hr>
- <h2> 插值语法</h2>
- <p>你好,{{ name }}</p>
- <hr>
- <h2>指令语法</h2>
- <!-- 错误示例:<a :href={{}}>点我去看-{{test.name}}1</a><br> -->
- <a href="https://www.baidu.com">点我去看-{{test.name}}1</a><br>
-
- <!-- 不加v-bind: hrel引号里面就是字符串,加v-bind: hrel引号里面就是js表达式 -->
- <a href="test.url">点我去看-{{test.name}}2</a><br>
- <a v-bind:href="test.url">点我去看-{{test.name}}3</a><br>
-
-
- <a :href="test.url">点我去看-{{test.name}}4</a><br>
- <!-- <a :href="test.url" :x="hello">点我去看-{{test.name}}4</a><br> -->
-
- </div>
-
- </template>
- <script>
- export default {
- name: 'twoPage',
- data () {
- return {
- name: '李四',
- test: {
- url: 'https://www.baidu.com',
- name: '百度'
- },
-
- msg: 'Welcome to Your Vue.js App'
- }
- }
- }
- </script>
- <style scoped>
- .twoPage {
- color: red;
-
- }
- </style>
Vue中有2种数据绑定的方式
单向绑定v-bind:数据只能从 data 流向页面
双向绑定v-model:数据不仅能从 data 流向页面,还可以从页面流向 data
备注:
1、双向绑定一般都应用在表单类元素上,如<input><select><textarea>等
2、v-model:value可以简写为v-model因为 v-model 默认收集的就是 value值
- <template>
- <div class="threePage">
- <!-- 数据绑定:-->
-
- <h1>第三章 数据绑定</h1>
- <hr>
- <!-- 单向数据绑定 -->
- 姓名:<input type="text" v-bind:value="name"><br><br>
- 姓名: <input type="text" :value="name"><br><br>
- <!-- 双向数据绑定 -->
- 姓名: <input type="text" v-model="name"><br><br>
- 姓名:<input type="text" v-model="name"><br><br>
-
- </div>
- </template>
- <script>
- export default {
- name: 'threePage',
- created() {
- console.log('onePage created')
- },
- data() {
- return {
- name: '李四',
-
- }
- }
- }
- </script>
- <style scoped>
- .twoPage {
- color: red;
-
- }
- </style>
M:模型Model ,data中的数据
V:视图View,模板代码
VM:视图模型ViewModel,Vue实例
注意:
data中所有的属性,都会出现在vm身上
vm身上的所有属性及Vue原型身上所有的属性,在Vue模板中都可以直接使用
数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)
1、Vue中的数据代理通过 vm 对象来代理 data 对象中属性的操作(读/写)
2、Vue中数据代理的好处: 更加方便的操作 data中的数据Vue
基本原理:
1.通过object.defineProperty()把data对象中所有属性添加到 vm上
2.为每一个添加到 vm 上的属性,都指定一个getter setter
3、在getter setter 内部去操作(读/写)data 中对应的属性
Vue 将 data 中的数据拷贝了一份到_data属性中,又将_data 里面的属性提到 vue实例 中(如name)。通过defineProperty 实现数据代理,这样通过geter/setter 操作 name,进而操作_data中的 name。而_data 又对 data 进行数据劫持,实现响应式
通俗易懂版本:
数据代理在 Vue.js 中是一个核心概念,它帮助我们理解 Vue 如何处理数据和视图之间的交互。下面我用一个简单的类比来解释数据代理的概念:
想象一下,你想要买一本书,但是你并不直接去书店购买,而是通过亚马逊这样的在线平台。在这个过程中,亚马逊就像是一个“数据代理”,它代表你与书店进行交易。你告诉亚马逊你想要哪本书,亚马逊从书店获取书,并且最终把书送到你手上。同时,如果书店更新了书的价格或库存,亚马逊也会及时地把这些信息更新给你看。
在 Vue.js 中,数据代理的工作原理类似。当你创建一个 Vue 实例时,Vue 会自动创建一个代理,这个代理指向 data 对象中的所有属性。这意味着,当你在模板中或者在 Vue 实例的方法中使用 this 来访问或修改数据时,你实际上是在通过这个代理操作 data 对象。
具体来说,以下是 Vue 中数据代理的几个关键点:
数据劫持:当 Vue 实例创建时,它会遍历 data 对象的所有属性,并使用 JavaScript 的 Object.defineProperty() 方法来转换这些属性。这使得 Vue 能够追踪到属性的读取和写入。
代理访问:Vue 会创建一个代理,让你可以通过 this 直接访问 data 对象中的属性,而不需要显式地写成 this.$data.propertyName。例如,你可以直接写 this.propertyName,Vue 会知道你应该是在访问 data 对象中的 propertyName。
响应式更新:由于数据被劫持,当数据发生变化时,Vue 会自动检测到这个变化,并更新依赖于这个数据的视图部分。这就是为什么在 Vue 中,数据的改变会自动反映到视图上,而不需要手动重新渲染。
所以,数据代理在 Vue 中的作用就是简化了数据的访问和修改,同时确保了数据的响应式,使得数据和视图能够自动同步。
- <template>
- <div class="fourPage">
-
- <!-- MVVM模型-->
-
- <h1>第四章 MVVM</h1>
- <hr>
- <h2>姓名:{{name}}</h2>
- <h2>年龄:{{age}}</h2>
- <h2>朋友:{{friends}}</h2>
- <h2>朋友1姓名:{{friends[0].name}}</h2>
- <h2>朋友1年龄:{{friends[0].age}}</h2>
- <h2>地址:{{address}}</h2>
- <h2>地址-省:{{address.province}}</h2>
- <h2>地址-市:{{address.city}}</h2>
- <h2>地址-街道:{{address.street}}</h2>
-
-
- </div>
- </template>
- <script>
- export default {
- name: 'fourPage',
- created() {
- // 打印整个 vm 实例
- console.log("vm实例", this)
- // 打印当前组件的 vm 实例中的 data 属性
- console.log("vm实例中的data", this.$data)
-
- console.log("vm实例中的name", this.name)
- console.log("vm实例中的age", this.age)
- console.log("vm实例中的friends", this.friends)
- console.log("vm实例中的friends[0].name", this.friends[0].name)
- console.log("vm实例中的friends[0].age", this.friends[0].age)
-
- console.log("vm实例中的address", this.address)
- console.log("vm实例中的address.province", this.address.province)
- },
- data() {
- return {
- name: '李四',
- age: 18,
- friends: [{
- name: '张三',
- age: 20
- }, {
- name: '王五',
- age: 22
- }],
- address: {
- province: '北京',
- city: '北京',
- street: '天安门'
- }
-
- }
- }
- }
- </script>
- <style scoped>
- .twoPage {
- color: red;
-
- }
- </style>
1.使用 v-on:xxx或 @xxx 绑定事件,其中 xxx 是事件名
2.事件的回调需要配置在 methods 对象中,最终会在 vm 上
3.methods 中配置的函数,不要用箭头函数,否则this 就不是 vm了3.
4.methods 中配置的函数,都是被 Vue 所管理的函数,this的指向是 vm 或 组件实例对象
5.@click="demo"和 @click="demo($event)"效果一致,但后者可以传参
Vue中的事件修饰符:
1. prevent 阻止默认事件(常用)
2. stop 阻止事件冒泡(常用)
3. once 事件只触发一次(常用)
4. capture 使用事件的捕获模式---不常用自己了解
5. self 只有 event.target 是当前操作的元素时才触发事件---不常用自己了解
6. passive 事件的默认行为立即执行,无需等待事件回调执行完毕---不常用自己了解
修饰符可以连续写,比如可以这么用:@click.prevent.stop="showInfo"
回车 enter
删除 delete
退出 esc
空格 space
换行 tab 特殊,必须配合 keydown 去使用
上up
下 down
左 left
右right
注意:
Vue 未提供别名的按键,可以使用按键原始的 key值去绑定,但注意要转为 kebab-case(多单词小写短横线写法)
系统修饰键(用法特殊)ctrl alt shift meta(meta 就是 win 键)
配合 keyup 使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发
指定 ctr+y使用 @keyup.ctr.y
配合 keydown 使用:正常触发事件
也可以使用 keyCode 去指定具体的按键(不推荐)
Vue.config.keyCodes.自定义键名=键码,可以去定制按键别名
- <template>
- <div class="fivePage">
- <h1>第五章 事件处理</h1>
- <hr>
- <h2>事件处理</h2>
- <button v-on:click="showInfo">点我提示信息(不传参)</button><br><br>
- <!-- 简写 -->
- <button @click="showInfo">点我提示信息(不传参)</button><br><br>
- <button @click="showInfo1($event, 66)">点我提示信息1(传参)</button><br><br>
-
- <hr>
- <h2>事件修饰符</h2>
- <!-- 阻止默认事件(常用) -->
- <a href="https://www.baidu.com" @click.prevent="showInfo2">阻止默认事件(prevent)</a><br><br>
-
- <!-- 事件冒泡 --弹出两次-->
- <div @click="showInfo2">
- <button @click="showInfo2">事件冒泡</button>
- </div><br><br>
- <!-- 阻止事件冒泡(stop) -->
- <div @click="showInfo2">
- <button @click.stop="showInfo2">阻止事件冒泡(stop)</button>
- </div><br><br>
- <!-- once 事件只触发一次(常用) -->
- <button @click.once="showInfo2">事件只触发一次(once)</button><br><br>
-
- <!-- 先2再1--先捕获再冒泡 -->
- <div class="box1" @click="showMsg(1)">
- div1 再冒泡
- <div class="box2" @click="showMsg(2)">
- div2 先捕获
- </div>
- </div>
- <!-- 外面的div1也先捕获 -->
- <div class="box1" @click.capture="showMsg(1)">
- div1 使用捕获事件
- <div class="box2" @click="showMsg(2)">
- div2 捕获
- </div>
- </div>
-
- <!-- 只有 event.target 是当前操作的元素时才触发事件 阻止了冒泡 -->
- <div @click.self="showInfo2">
- <button @click="showInfo2">阻止事件冒泡(stop)</button>
- </div><br><br>
-
- <!-- wheel 滚轮事件 -->
- <!-- scroll 滑动条事件 -->
- <ul @scroll="demo" class="list">
- <li>1</li>
- <li>2</li>
- <li>3</li>
- <li>4</li>
- <li>5</li>
- <li>6</li>
- <li>7</li>
- <li>8</li>
- <li>9</li>
- <li>10</li>
-
- </ul>
- <hr>
-
- <h2>键盘事件</h2>
- <input type="text" placeholder="按下回车提示信息" @keyup.enter="showInfo"><br><br>
- <input type="text" placeholder="按下空格提示信息" @keyup.space="showInfo"><br><br>
- <input type="text" placeholder="按下tab提示信息" @keydown.tab="showInfo"><br><br>
- <input type="text" placeholder="按下ctrl+y提示信息" @keyup.ctrl.y="showInfo"><br><br>
- </div>
- </template>
- <script>
- export default {
- name: 'fivePage',
- created() {
- // 打印整个 vm 实例
- console.log("vm实例", this)
- // 打印当前组件的 vm 实例中的 data 属性
- console.log("vm实例中的data", this.$data)
- },
- data() {
- return {
- name: '李四',
- age: 18,
- address: {
- province: '北京',
- city: '北京',
- street: '天安门'
- }
-
- }
- },
- methods: {
- showInfo(event) {
- alert('你好' + this.name)
- console.log("this", this)
-
- console.log("event", event)
- console.log("event.target.innerText", event.target.innerText)
-
- },
- showInfo1(event, number) {
- console.log("event.target.innerText", event.target.innerText)
- console.log(event, number)
-
- alert('你好' + this.name + number)
-
- },
- showInfo2() {
- alert('打开百度')
-
- },
- showMsg(msg) {
- console.log("msg", msg)
-
- },
- demo() {
- console.log("@")
- }
- }
- }
- </script>
- <style scoped>
- .box1 {
- width: 200px;
- height: 200px;
- background-color: rgb(196, 137, 137);
- }
-
- .box2 {
- width: 100px;
- height: 100px;
- background-color: rgb(177, 177, 231);
- }
-
- .twoPage {
- color: red;
-
- }
-
- .list {
- width: 200px;
- height: 200px;
- background-color: rgb(177, 177, 231);
- overflow-y: auto;
- }
-
- li {
- height: 100px;
- }</style>
要用的属性不存在,需要通过已有属性计算得来
底层借助了 objcet.defineproperty()方法提供的 getter 和 setter
a.初次读取时会执行一次
b.当依赖的数据发生改变时会被再次调用
与 methods 实现相比,内部有缓存机制(复用),效率更高,调试方便
计算属性最终会出现在 vm 上,直接读取使用即可
如果计算属性要被修改,那必须写 set 函数去响应修改,且 set:中要引起计算时依赖的数据发生改变
如果计算属性确定不考虑修改,可以使用计算属性的简写形式
分别输入姓和名,展示“姓-名”内容,通过四种方法实现
- <template>
- <div class="sixPage">
- <h1>计算属性</h1>
- <!-- 方法一:插值语法 -->
- 姓:<input type="text" v-model="surname" /><br/><br/>
- 名:<input type="text" v-model="name" /><br/><br/>
- 姓名:<span>{{ surname +name }}</span><br/><br/>
- 姓名:<span>{{ surname }}-{{ name}}</span><br/><br/>
- <!-- 方法二:method实现--数据发生变化,模板会重新解析(注意需要加括号) -->
- <hr>
- 全名:<span>{{ fullName() }}</span><br/><br/>
-
- <!-- 计算属性 -->
- <hr>
- 全名:<span>{{ fullName1 }}</span><br/><br/>
-
- <!-- 监听属性 -->
- <!-- <hr>
- 全名:<span>{{ fullName0 }}</span><br/><br/> -->
-
-
- </div>
- </template>
- <script>
- export default {
- name: "sixPage",
- data() {
- return {
- surname: "姓",
- name: "名",
- fullName0: "姓-名"
- };
- },
- methods: {
- fullName() {
- return this.surname + this.name;
- }
- },
- computed: {
-
- // 完整写法
- // fullName1: {
- // get() {
- // console.log("计算属性被调用了");
- // return this.surname + this.name;
- // },
- // set(value) {
- // console.log("计算属性被修改了", value);
- // const arr = value.split("-");
- // this.surname = arr[0];
- // this.name = arr[1];
- // }
- // },
- // 简写形式
- fullName1() {
- console.log("计算属性被调用了");
- return this.surname + this.name;
- }
- },
-
-
- // watch: {
- // surname(newVal, oldVal) {
- // console.log("姓被修改了", newVal, oldVal);
- // this.fullName0 = newVal + this.name;
- // },
- // name(newVal, oldVal) {
- // console.log("名被修改了", newVal, oldVal);
- // this.fullName0 = this.surname + newVal;
- // }
- // }
- };
- </script>
- <style lang="scss" scoped></style>
1 当被监视的属性变化时,回调函数自动调用,进行相关操作
2 监视的属性必须存在,才能进行监视,既可以监视 data,也可以监视计算属性
3 配置项属性 immediate:false。改为 true,则初始化时调用一次handler(newValue,oldValue)
4 监视有两种写法
创建 Vue 时传入 watch:{}配置a.
通过 vm.$watch()监视
点击按钮切换天气,分别用不同方法实现,使用Watch来监测天气变化并打印到控制台
- <template>
- <div class="sevenPage">
- <h1>监听属性</h1>
- <hr>
- <!-- 方法一: -->
- <h2>今天天气很{{ isHot ? '炎热' : '凉爽' }}</h2>
- <button @click="isHot = !isHot">切换天气</button>
-
- <!-- 方法二 -->
- <h2>今天天气很{{ info }}</h2>
- <button @click="changeWeather">切换天气</button>
-
-
- <!-- 侦听属性--watch监视属性 -->
-
-
- </div>
- </template>
- <script>
- export default {
- name: "sevenPage",
- data() {
- return {
- isHot: true,
- };
- },
- // 方法二
- computed: {
- info() {
- return this.isHot ? '炎热' : '凉爽'
- }
- },
- methods: {
- changeWeather() {
- this.isHot = !this.isHot
- }
- },
-
- watch: {
- isHot: {
- immediate: true, //初始化时让handler调用一下
- deep: true, //深度监听
-
- handler(newValue, oldValue) {
- console.log('isHot被修改了', newValue, oldValue)
- }
- },
- info: {
- immediate: true, //初始化时让handler调用一下
- handler(newValue, oldValue) {
- console.log('info被修改了', newValue, oldValue)
- }
- }
- },
- }
- </script>
- <style lang="scss" scoped></style>
写法:
v-if="表达式"
v-else-if="表达式"
v-else适用于:
切换频率较低的场景,因为不展示的 DOM 元素直接被移除
注意:v-if可以和v-else-if V-else一起使用,但要求结构不能被打断
写法:
v-show="表达式"
适用于:
切换频率较高的场景
特点:
不展示的 DOM 元素未被移除,仅仅是使用样式隐藏掉 display:none
备注:使用 v-if 的时,元素可能无法获取到,而使用 v-show 一定可以获取到
template标签不影响结构,页面 html中不会有此标签,但只能配合v-if,不能配合 v-show
- <template>
- <div>
- <h1>第八章 条件渲染</h1>
- <h2>当前的n值是:{{ n }}</h2>
- <button @click="n++">点击n+1</button>
- <button @click="n--">点击n-1</button>
- <h3 v-if="n === 1">n等于1</h3>
- <h3 v-else-if="n === 2">n等于2</h3>
- <h3 v-else-if="n === 3">n等于3</h3>
- <h3 v-else>n等于其他</h3>
- <hr>
- <h3 v-show="n === 1">n等于1</h3>
- <h3 v-show="n === 2">n等于2</h3>
- <h3 v-show="n === 3">n等于3</h3>
- <h3 v-show="n === 4">n等于4</h3>
- <h2 v-if="a">a为true</h2>
- </div>
- </template>
- <script>
- export default {
- name: "eightPage",
- data() {
- return {
- n: 0,
- a:true,
- };
- },
- methods: {},
-
- };
- </script>
- <style lang="scss" scoped></style>
用于展示列表数据
语法:
v-for="(item, index) in/of list" :key="index" 这里的Key可以是index也可以是对象的唯一标识
item表示列表的每一项
index表示列表的每一项的索引
list表示要渲染的列表数据可遍历的数据类型:数组、对象、字符串、数字
v-for可以遍历对象
v-for可以嵌套使用
v-for可以和v-if一起使用,但是要避免同时使用,因为v-for的优先级比v-if的优先级高,会导致v-if失效
v-for可以和v-model一起使用,但是要避免同时使用,因为v-for的优先级比v-model的优先级高,会导致v-model失效
v-for可以和v-bind一起使用,但是要避免同时使用,因为v-for的优先级比v-bind的优先级高,会导致v-bind失效
参考:Vue 列表渲染 key的原理和作用_列表渲染 key值在列表上方添加个人信息-CSDN博客
-
- <template>
- <div>
- <h1>第九章 列表渲染</h1>
- <hr>
- <h2>v-for 指令(遍历数组)人员列表</h2>
- <ul>
- <li v-for="(item, index) in persons" :key="index">{{ item.name }}-{{item.age}}</li>
- </ul>
- <h2>v-for 指令遍历对象</h2>
- <ul>
- <li v-for="(value, key) in obj" :key="key">{{ key }}:{{ value }}</li>
- </ul>
- <h2>v-for 遍历字符串</h2>
- <ul>
- <li v-for="(item, index) in 'hello'" :key="index">{{ item }}-{{index}}</li>
- </ul>
-
- </div>
-
-
- </template>
- <script>
- export default {
- name: "ninePage",
- data() {
- return {
- list: ["apple", "banana", "orange"],
- obj: {
- name: "张三",
- age: 18,
- gender: "男",
- },
- persons: [
- { id: 1, name: "张三", age: 18 },
- { id: 2, name: "李四", age: 20 },
- { id: 3, name: "王五", age: 22 },
- ],
-
-
- };
- },
- methods: {},
-
- };
- </script>
- <style lang="scss" scoped></style>
- <template>
- <div>
-
- <h1>收集表单数据</h1>
-
- <form @submit.prevent="demo">
- 账号:<input type="text" v-model.trim="userInfo.account" />
- <br /><br />
- 密码:<input type="password" v-model="userInfo.password" />
- <br /><br />
- 年龄:<input type="number" v-model.number="userInfo.age" />
- <br /><br />
- 性别:
- <input type="radio" v-model="userInfo.gender" value="male" name="sex" />男
- <input type="radio" v-model="userInfo.gender" value="female" name="sex" />女
- <br /><br />
- 爱好:
- <input type="checkbox" v-model="userInfo.hobby" value="study" />篮球
- <input type="checkbox" v-model="userInfo.hobby" value="game" />足球
- <input type="checkbox" v-model="userInfo.hobby" value="eat" />羽毛球
- <br /><br />
- 校区:
- <select v-model="userInfo.city">
- <option value="">请选择</option>
- <option value="beijing">北京</option>
- <option value="shanghai">上海</option>
- <option value="shenzhen">深圳</option>
- <option value="guangzhou">广州</option>
- </select>
- <br /><br />
-
- 介绍:
- <textarea v-model.lazy="userInfo.other"></textarea>
- <br /><br />
- <input type="checkbox" v-model="userInfo.agree" />阅读并接受
- <br /><br />
- <a href="http://www.baidu.com">《用户协议》</a>
- <button type="submit">提交</button>
- </form>
- </div>
- </template>
- <script>
- export default {
- name: "namePage",
- data() {
- return {
- userInfo: {
- account: "",
- password: "",
- age: 0,
- gender: "",
- hobby: [],
- city: "beijing",
- other: "",
- agree: false,
- sex: "female"
-
- }
- }
- },
- methods: {
- demo() {
- console.log(JSON.stringify(this.userInfo))
- }},
-
- };
- </script>
- <style lang="scss" scoped></style>
1.v-bind 单向绑定
2.v-model 双向绑定
3.v-if 条件渲染,动态控制节点是否存在
4.v-else-if 条件渲染,动态控制节点是否存在
5.v-else 条件渲染,动态控制节点是否存在
6.v-for 遍历数组
7.v-on 绑定事件监听,简写为@
8.v-show 条件渲染,动态控制节点是否展示
9.v-text 向其所在节点渲染文本内容
10.v-html 渲染包含Html结构的内容
11.v-cloak 解决网速慢页面展示出问题--自己了解
12.v-once 初次渲染变为静态内容
13.v-pre 跳过当前元素和子元素的编译过程,加快编译--不常用
<!-- 作用是向其所在的节点中渲染文本内容 -->
<!-- 与插值语法的区别:v-text会替换掉节点中的内容,{{XXX}}则不会,更加灵活 -->
作用:向指定节点中渲染包含 html 结构的内容
与插值语法的区别:
i.v-htm1 会替换掉节点中所有的内容,{{xxx}}则不会
ii.v-html可以识别 html 结构
严重注意 v-html 有安全性问题!!!
i,在网站上动态渲染任意 htm1 是非常危险的,容易导致 Xss 攻击
ii.一定要在可信的内容上使用 v-htm1,永远不要用在用户提交的内容上!!!
作用:v-once所在节点在初次动态渲染后,就视为静态内容了
以后数据改变再也不会进行渲染 用于性能优化
作用: 跳过这个元素和它子元素的编译过程,用于跳过没有指令语法没有插值语法的节点,加快编译
- <template>
- <div>
-
- <h2>内置指令</h2>
-
- <!-- v-text指令 -->
- <div>你好,{{name}}</div>
- <div v-text="name"></div>
- <div v-text="str"></div>
- <hr >
- <div>你好,{{name}}</div>
- <div v-html="str"></div>
- <hr>
- <!-- v-once指令 -->
- <h2 v-once>初始化n值是{{n}}</h2>
- <h2>当前的n值是{{n}}</h2>
- <button @click="n++">点我n+1</button>
- <hr>
-
- <!-- v-pre指令 -->
- <h2 v-pre> 正常用于文本这种</h2>
- <h2 v-pre>初始化n值是{{n}}</h2>
- <h2>当前的n值是{{n}}</h2>
- <button @click="n++">点我n+1</button>
-
- </div>
-
-
- </template>
- <script>
- export default {
- name: "namePage",
- data() {
- return {
- name: "张三",
- str: "<h1>hello</h1>",
- n: 0
- };
- },
- methods: {},
-
- };
- </script>
- <style lang="scss" scoped></style>
a.又名生命周期回调函数、生命周期函数、生命周期钩子
b.是什么: vue 在关键时刻帮我们调用的一些特殊名称的函数
c.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的
d.生命周期函数中的 this 指向是 vm 或 组件实例对象,及this可以点出data中的所有属性
创建期间 beforeCreate created
挂载期间 beforeMount mounted
更新期间 beforeUpdate updated
销毁期间 beforeDestroy destroyed
1. mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】
2. beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】
关于销毁Vue实例
1. 销毁后借助原生的 JS 操作: clearInterval(vm.$timerId)
2. 一般不会在 beforeDestroy 操作数据,因为即便操作了数据,也不会再触发更新流程了
打印查看各个生命周期顺序,定时器的使用。
- <template>
- <div>
-
- <h2>生命周期</h2>
-
- </div>
- </template>
- <script>
- export default {
- name: "namePage",
- data() {
- return {
- myTimer: null,
- opacity:1
- };
- },
- beforeCreate() {
- console.log("beforeCreate");
- },
- created() {
- console.log("created");
- },
- beforeMount() {
- console.log("beforeMount");
- },
- beforeUpdate() {
- console.log("beforeUpdate");
- },
- updated() {
- console.log("updated");
- },
- beforeDestroy() {
- clearInterval(this.myTimer);
-
- console.log("beforeDestroy");
- },
- destroyed() {
- console.log("destroyed");
- },
-
- mounted() {
- console.log("mounted");
- // 定时器-60毫秒
- this.myTimer=setInterval(() => {
- this.opacity -= 0.01
- if (this.opacity <= 0) this.opacity = 1
- }, 16)
- },
- methods: {},
-
- };
- </script>
- <style lang="scss" scoped></style>
Element UI是一个基于Vue 2的UI组件库,它提供了丰富的组件和功能,帮助开发者快速构建具有统一风格的用户界面。
当你在Vue项目中引入Element UI时,你实际上是在添加一个外部依赖到你的项目中。这个依赖包含了Element UI的所有组件、样式和相关脚本,它们可以被你的Vue应用所使用。
在引入Element UI时,你可以选择全局引入整个库,也可以按需引入特定的组件,以优化项目的加载时间和资源消耗。无论是哪种方式,引入Element UI的过程都涉及到在项目中添加相应的依赖,并在代码中导入和注册这些组件,以便在Vue模板中使用它们。
因此,可以说引入Element UI是引入库的一个实例,它扩展了Vue应用的功能,提供了额外的UI组件和交互能力。
打开终端,运行 npm install element-ui --save
打开main.js修改
- import Vue from 'vue'
- import ElementUI from 'element-ui'
- import 'element-ui/lib/theme-chalk/index.css'
-
- Vue.use(ElementUI)
- <pre>
- <el-button type="primary">主要按钮</el-button>
- <el-button>默认按钮</el-button>
- <el-button type="danger">危险按钮</el-button>
- </pre>
打开终端,运行:npm install vue-router@3
src文件夹中增加router文件夹,并添加index.js文件
- import Vue from 'vue';
- import VueRouter from 'vue-router';
- import Home from '../views/Home.vue'; // 假设Home.vue是你的首页组件
-
- Vue.use(VueRouter);
-
- const routes = [
- {
- path: '/',
- name: 'home',
- component: Home
- },
- // 更多路由...
- ];
-
- const router = new VueRouter({
- mode: 'history', // 使用HTML5 History模式,去掉URL中的#
- base: process.env.BASE_URL,
- routes
- });
-
- export default router;
- import router from './router'
- new Vue({
- router,//注册路由
- render: h => h(App),
- }).$mount('#app')
<router-view></router-view>
- <router-link to="/">首页</router-link>
- <router-link to="/about">关于</router-link>
- this.$router.push({ name: 'about' });
- this.$router.push({ path: '/about' });
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。