vue的常用基础知识

2023-11-06

哈喽,今天不加班,回来整理一下以前的旧笔记,给你们分享一波基础知识

1.Vue模板的使用

<div id="app">
    {{ msg }} //vue中的data又属性值
	{{ 1+2+4*7/5 }}
	{{ isShow?'真好看':'真丑' }}
	{{ parseInt('10.2345') }}
</div>
  • {{ }}里面可以写任意js表达式,变量,函数,属于js环境
  • 如果里面写的变量,一般都是挂载在实例中的变量
  • 如果里面写的是函数调用,那这个函数只能是Vue实例methods上的方法,但函数调用如果没有返回值,那么在模板中就不会渲染

2.Vue指令的使用

v-model

// 必须要注意,这是针对表单控件的指令,可以让表单内容和Vue的数据双向绑定
<label>请输入内容:</label>
<input type="text" v-model="text"> // 与Vue的data绑定
 const vm = new Vue({
     el:"#app",
     data:{ 
         text: '' // 这是input框输入的内容,可以使用模板在页面中打印出来
     }
 })

v-text

只能渲染内容,如果字符串中有标签,会把标签当作字符串一起渲染,类似于原生js中的innerText() 方法

v-html

// 用来渲染富文本数据,渲染内容包括内容和标签,相当于原生js中的innerHTML()方法
<div v-html="content"></div>

const vm = new Vue({
	el:"#app",
	data:{ 
        content:`
            <h1 style="color:red">我是富文本数据</h1>
        `
    }
})

v-bind

// 属性的动态绑定指令,很常用,使用后属性的属性值将不再是字符串,而是变量
<div id="app">
   	<div v-bind:id="a">等我打完</div> 
     <input type="text" v-model="imgUrl">
     <img v-bind:src="imgUrl" alt="">  //内部是js环境,解析的是变量,不是字符串,如果不写:  那么解析的就是字符串了
</div>

const vm = new Vue({
    el: "#app",
    data:{ 
        a: "box",
        imgUrl: ""
    }
})

:class="{}" / :class="[]"
// 通常是class和style使用的
// 当给class使用时,class的值可以是对象,也可以是数组,表示有多个类
<div id="app">
	<div 
		v-for="(item,index) in arr" 
		key= "item.index"
		@click="testClick(index)"
		:class="{num === index?active:''}"></div>
</div>

const vm = new Vue({
	el: '#app',
	data: {
		arr: [1,2,3,4,5,6],
		num: 0 // 默认值是0,表示下标为0的div的类名是active,其他没有active的类名
	},
	methods: {
		textClick(i){
			this.num = i //每当点击当前的的div是,对应的下标i将赋值给num,只要满足num === index ,那么active就是当前div的类名
		}
	}
})

// 当class的值是数组时,数组的每个元素都是该div的类名
<div :class="['active','isShow','isNumber']"></div>
=>
<div class="active isShow isNumber"></div>


:style="{}"
  <div :style="{
      width: 100+200+'px',
      height: 1>2?'400px':'300px',
      background:color
  }">11</div>
  <!-- 借此成 宽300300背景红色div -->
  /*
  	:style=""
   	{}
   	对象键css样式
   	值可以是表达式,可以是变量
  */

3. MVVM原理

这就是Vue双向绑定的原理,改变数据,视图刷新

  • M 数据
  • V 视图
  • mv => 数据改变视图自动刷新
  • vm => new Vue实例

主要三个阶段

1. 创建阶段

new实例中的data数据对象创建时,vue会自动遍历

在遍历的时候,会使用Object.defineProperty中的setter/getter拦截每个对象的属性,

当data数据改变,vue中的setter触发

同时,会触发一个观察者watcher,setter和watcher一起触发回调函数render

2. 生成虚拟dom阶段

回调函数中的render函数,作用渲染虚拟dom,

3. 同步和渲染阶段

每次data数据改变时,都会有一次虚拟dom的类比较,当前的虚拟dom会在先前保存在内存中的虚拟dom比较

通过key属性,每层对应查找key值,发现没有key值,则会替换掉

比较出不同后新的虚拟dom节点会替换旧的,并储存在内存中

4.监听器

监听data的变量或对象属性值,只要改变了,就执行方法

<div id="app">
	<div @click="textWatch">
		{{obj.a}}
	</div>
</div>
const vm = new Vue({
	el: '#app',
	data: {
		obj: {
			a: 1,
			b: 2
		}
	},
	watch: {
		obj.a: {
			handler(newVal,oldVal){
				// 开始监听对象a的属性值
				// newVal 表示改变后a的值,oldVal 表示原始a的值
				...
			}
		},
		obj: {
			deep: true
				// 深度监听,监听对象必须要使用deep,否则监听不到
				immediate: true
				// 表示页面渲染时是否立马监听
			handler(newVal,oldVal){
				...
			}
		}
		
	}
	methods: {
		textWatch(){ // 用来改变对象属性值的事件
			this.obj.a = -1
		}
	}
})
# 常用小伙伴分不清computed和watch的区别,我来给你们分析一下
/*
	watch属于异步操作,只要监听的目标数据发生改变,就会触发watch中的方法,否则永不触发
	computed属于同步操作,这是依赖于data数据的属性,如果你要用到的一个数据基于data数据,则可以将其放在computed中,
	computed: {
		testData: ()=>{ // 记住testData变量不能定义在data中,因为变量不能重复定义
			return obj.a += 1
		}
	}
*/

算了,干脆直接另起一个小目录,computed这个也很重

// computed是基于响应式数据依赖的缓存的一个`值`
// 说的很明了,computed返回的是一个值,computed返回的值会缓存

<div id="app">
  {{ num }}
  {{ doubleNum }}
  <button @click="change">改变计算属性 </button>
</div>
const vm = new Vue({
  el: '#app',
  data:{
    num: 2
  },
  methods: {
    change(){
      this.doubleNum = 100;
    }
  },
  computed: {
    doubleNum: {	// get和set必须成对出现
      get(){ // 可以利用其他数据的值赋值给计算数据的属性
        return this.num*4 // 此时doubleNum等于400
      },
      set(val){ // 拦截计算属性的值并修改
        console.log(val,'setter触发');
        // 中去修改依赖
        this.num = val/2; // 此时doubleNum等于200
      }
    }
  }
})

顺便延申一下关于Object.defineProperty方法
这个方法是对象的一个很重要的属性,它可以定义对象的属性值,不管这个值是否存在,原理是通过劫持对象的属性来进行获取操作和赋值操作

// Object,defineProperty(objName,[...property],{get(),set()})
let test = {
	num: 0
}
let count = 1
// get和set必须成对出现
Object.defineProperty(test,'num', { // 劫持test的num属性
     get: ()=>{		// 利用其他数据给计算属性返回值
       return count // 此时count已经赋值给了set的newVal
     },
     set: (newVal)=>{ // 拦截计算属性的值
       // 在setter中去修改依赖
       num = newVal // 等待数据改变时触发
     }
 })
// 我们来测试一下结果
console.log(test.num) // 1
// 如果我们把num的值改变,看会不会影响count的值
count = 10 // get会重新返回count,将count赋值给set的newVal
console.log(test.num) // 10

5.nextTick

【此部分内容来自https://www.jianshu.com/p/a7550c0e164f】
小伙伴们都知道Vue中的DOM更新都是异步的吧

<-- 我们先确认一下DOM更新是异步操作的 -->
<div class="app">
  <div ref="msgDiv">{{msg}}</div>
  <div v-if="msg1">Message got outside $nextTick: {{msg1}}</div>
  <div v-if="msg2">Message got inside $nextTick: {{msg2}}</div>
  <div v-if="msg3">Message got outside $nextTick: {{msg3}}</div>
  <button @click="changeMsg">
    Change the Message
  </button>
</div>
new Vue({
  el: '.app',
  data: {
    msg: 'Hello Vue.',
    msg1: '',
    msg2: '',
    msg3: ''
  },
  methods: {
    changeMsg() {
      this.msg = "Hello world."
      this.msg1 = this.$refs.msgDiv.innerHTML
      this.$nextTick(() => {
        this.msg2 = this.$refs.msgDiv.innerHTML
      })
      this.msg3 = this.$refs.msgDiv.innerHTML
    }
  }
})

在这里插入图片描述
从图中可以得知:msg1和msg3显示的内容还是变换之前的,而msg2显示的内容是变换之后的。其根本原因是因为Vue中DOM更新是异步的
理解: nextTick() 是将回调函数延迟在下一次dom更新数据后调用,简单的理解是:当数据更新了,在dom中渲染后,自动执行该函数

使用场景

  • 如果你要在creatd()钩子函数中进行DOM操作,就一定要放在Vue.nextTick()的回调函数中,此时的效果就是相当于mounted()方法,这个方法用的不错
  • 如果你有个方法,需要在数据变化后就立马触发,如果你的方法涉及到DOM结构渲染,并且时随着数据的改变而改变DOM结构时,就可以考虑把这个方法写在next Tick()的回调函数中
// 就比如你有一个请求,这个请求到的数据关系到页面的重绘,有时候可能会存在请求数据后,数据还没到,单页面就已经渲染完成了,此时我们可以将这个请求方法放入`nextTick()`中
// `nextTick()`可以写在任意地方,比如methods,mounted...

三个重要的变量

  • callbacks 用来储存所有需要执行的回调函数
  • pending 用来标志是否正在执行回调函数
  • timerFunc 用来触发执行回调函数

给你们推荐一个贼牛皮的博客关于next Tick()的文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue的常用基础知识 的相关文章

随机推荐

  • JS之对象-对象声明及静态方法

    声明对象 1 原型实例化 声明对象的方式1 原型实例化 let obj1 new Object obj1 name obj1 张三 obj1 getName function return this name console log obj
  • 八十七.查找与排序习题总结(二)

    查找与排序习题总结 一 查找与排序习题总结 三 题一 调整数组顺序 奇数在左 偶数在右 调整数组的顺序使奇数位于偶数前面 输入一个整数数组 调整数组中数字的顺序使得所有奇数位于数组的前半部分 所有偶数位于数组的后半部分 要求时间复杂度为O
  • Rot.js 随机地牢,迷宫地图生成

    js 插件随机地牢 迷宫地图生成 插件git https github com ondras rot js tree master dist 使用 1 我们的游戏是在网页内进行的 一个基本的 HTML 文件就足够了
  • SPDK块设备

    SPDK视角每个App由多个子系统 subsystem 构成 同时每个子系统又包含多个模块 module 子系统和模块的注入都是可插拔的 通过相关的宏定义声明集成到SPDK组件容器里 其中子系统的注入可通过声明SPDK SUBSYSTEM
  • MMDeploy部署实战系列【第一章】:Docker,Nvidia-docker安装

    MMDeploy部署实战系列 第一章 Docker Nvidia docker安装 这个系列是一个随笔 是我走过的一些路 有些地方可能不太完善 如果有那个地方没看懂 评论区问就可以 我给补充 版权声明 本文为博主原创文章 遵循 CC 4 0
  • Type cannot use 'try' with exceptions disabled

    cannot use throw with exceptions disabled 在为 DragonBonesCPP refactoring 的 cocos2d x 3 2 demo 增加 Android 编译时 NDK 报了一个编译错误
  • 数据结构刷题训练营1

    开启蓝桥杯备战计划 每日练习算法一题 坚持下去 想必下一年的蓝桥杯将会有你 笔者是在力扣上面进行的刷题 由于是第一次刷题 找到的题目也不咋样 所以 就凑合凑合吧 笔者打算从数据结构开始刷起 毕竟现在刚刚接触到数据结构 在力扣上找到的刷题链接
  • 计算机方面英语文献翻译(学习记录更新中)

    在万方找的英文文献摘要 自己翻译的 1 考虑到时间序列数据的高维度和复杂性给数据挖掘带来的困难以及聚类分析在时间序列数据挖掘领域中的重要性 本文总结了国内外时间序列数据聚类的研究现状 时间序列聚类可以被分为全时间序列聚类和子序列聚类 并且可
  • Python流体动力学共形映射库埃特式流

    流体动力学简述 在物理学和工程学中 流体动力学是流体力学的一个分支学科 它描述了流体 液体和气体的流动 它有几个子学科 包括空气动力学 研究空气和其他运动中的气体 和流体动力学 研究运动中的液体 流体动力学具有广泛的应用 包括计算飞机上的力
  • 携程酒店数据爬取2020.5

    携程酒店数据爬取2020 5 1 开题 目前网上有好多爬取携程网站的教程 大多数通过xpath beautifulsoup 正则来解析网页的源代码 然后我这个菜b贪方便 直接copy源码的xpath paste在xpath helper改改
  • Kaggle手势符号识别项目实战

    项目数据集地址 https www kaggle com datasets ardamavi sign language digits dataset 观察到数据集已经做过预先的整理 十分工整 txt文件中类别标记清晰详细 项目文件如上图所
  • 小程序+单页+需要服务器,小程序单页设计

    小程序单页设计 内容精选 换一换 I O分析以存储块设备为分析对象 分析得出块设备的I O操作次数 I O数据大小 I O队列深度 I O操作时延等性能数据 并关联到造成这些I O性能数据的具体I O操作事件 进程 线程 调用栈 应用层I
  • iOS自动化布局-AutoLayout约束优先级

    约束的优先级 AutoLayout添加的约束中也有优先级 Priority 优先级的数值1 1000 分为两种情况 一种情况是我们经常添加的各种约束 默认值1000 最大值 优先执行 条件允许的话系统会自动满足我们的约束需求 第二种就是固有
  • 学习OpenCV:rotatedRectangleIntersection计算两个旋转矩形的交集面积

    如图所示 计算两个旋转矩形相交重合区域的顶点 最多返回8个顶点 通过contourArea可返回该顶点集合的面积 void DrawPointSet Mat imgInoutput vector
  • 区块链扫盲之私钥、公钥和地址

    公开密钥 public key 简称公钥 私有密钥 private key 简称私钥 是密码学里非对称加密算法的内容 顾名思义 公钥是可以公开的 而私钥则要进行安全保管 私钥是由随机种子生成的 公钥是将私钥通过算法推导出来 由于公钥太长 为
  • python socket编程之tcp协议多客户端连接

    1 socket 介绍 socket 原意插座 插孔 计算机中一般称为套接字 在同一台计算机中的两个程序可以通过文件 管道 队列等方式进行通信 但是在网络中 两台计算机之间的通讯就需要依靠socket进行通信 2 socket之tcp协议
  • 利用Anaconda完成Python环境安装及配置

    1 Anaconda 1 1 配置过程 Anaconda是一个开源的Python和R编程语言的软件包管理器和环境管理器 用于数据科学和机器学习的开发 进入官网https www anaconda com 下载安装包 next gt arge
  • Host is not allowed to connect to this MySQL server

    意思其实就是我们的MySQL不允许远程登录 所以远程登录失败了 解决方法如下 1 在装有MySQL的机器上登录MySQL mysql u root p密码 2 执行use mysql 3 执行update user set host whe
  • matlab神经网络

    Solve an Input Output Fitting problem with a Neural Network Script generated by Neural Fitting app Created 03 Jan 2022 1
  • vue的常用基础知识

    哈喽 今天不加班 回来整理一下以前的旧笔记 给你们分享一波基础知识 1 Vue模板的使用 div msg vue中的data又属性值 1 2 4 7 5 isShow 真好看 真丑 parseInt 10 2345 div 里面可以写任意j