| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> JavaScript知识库 -> Vue常用属性 -> 正文阅读 |
|
|
[JavaScript知识库]Vue常用属性 |
|
目录 1、计算属性 - computed模板中放入太多的逻辑(方法)会让模板过重且难以维护,使用计算属性可以让模板变得简洁易于维护。计算属性是基于它们的响应式依赖进行缓存的,计算属性比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化。 计算属性定义在Vue对象中,通过关键词 核心点:
示例 <div id="app">
? ?<!-- 当多次调用 cfn计算属性时只要里面的 num值不改变,它会把第一次计算的结果直接返回直到data中的num值改变 计算属性才会重新发生计算 -->
? ?<div>{{ cfn }}</div>
? ?<div>{{ cfn }}</div>
? ?<!-- 调用methods中的方法的时候 他每次会重新调用 -->
? ?<div>{{ fn() }}</div>
? ?<div>{{ fn() }}</div>
</div>
<script src="./js/vue.js"></script>
<script type="text/javascript">
? ?const vm = new Vue({
? ? ? ?el: "#app",
? ? ? ?data: {
? ? ? ? ? ?num: 10,
? ? ? },
? ? ? ?// 方法
? ? ? ?methods: {
? ? ? ? ? ?fn() {
? ? ? ? ? ? ? ?console.log("methods");
? ? ? ? ? ? ? ?return this.num;
? ? ? ? ? },
? ? ? },
? ? ? ?// 计算属性
? ? ? ?computed: {
? ? ? ? ? ?cfn() {
? ? ? ? ? ? ? ?console.log("computed");
? ? ? ? ? ? ? ?return this.num;
? ? ? ? ? },
? ? ? },
? });
</script>
注意:只要依赖的数据源不发生改变,计算属性里的对应方法就只被调用1次,其它时候被调用时则使用缓存。提高效率。 2、监听器 - watch使用watch来侦听data中数据的变化,watch中的属性(watch是对象格式)一定是data 中已经存在的数据。(特殊情况除外) 使用场景:数据变化时执行异步或开销比较大的操作。
案例:给定三个输入框,第一个为姓输入框,第二个为名输入框,第三个为姓名组合结果框;要求当用户更新姓或名后,第三个输入框自动生成完整的姓名结果。 语法 new Vue({
.....
watch: {
data中数据的名称: fn方法,
....
}
})
参考代码: <div id="app">
? ?<p><input type="text" v-model='firstName' placeholder="姓" /></p>
? ?<p><input type="text" v-model='lastName' placeholder="名" /></p>
? ?<p><input type="text" v-model='fullName' placeholder="全名" /></p>
</div>
?
<script src="./js/vue.js"></script>
<script type="text/javascript">
? ?const vm = new Vue({
? ? ? ?el: '#app',
? ? ? ?data: {
? ? ? ? ? ?firstName: '',
? ? ? ? ? ?lastName: '',
? ? ? ? ? ?fullName: ''
? ? ? },
? ? ? ?watch: {
? ? ? ? ? ?firstName: function(val) {
? ? ? ? ? ? ? ?this.fullName = val + ' ' + this.lastName
? ? ? ? ? },
? ? ? ? ? ?lastName: function(val) {
? ? ? ? ? ? ? ?this.fullName = this.firstName + ' ' + val
? ? ? ? ? }
? ? ? }
? })
</script>
注意:当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,此时就需要deep属性对对象进行深度监听。 使用对象的数据形式改写上述案例参考代码: <div id="app">
? ?<p><input type="text" v-model='userinfo.firstName' placeholder="姓" /></p>
? ?<p><input type="text" v-model='userinfo.lastName' placeholder="名" /></p>
? ?<p><input type="text" v-model='userinfo.fullName' placeholder="全名" /></p>
</div>
?
<script src="./js/vue.js"></script>
<script type="text/javascript">
? ?const vm = new Vue({
? ? ? ?el: '#app',
? ? ? ?data: {
? ? ? ? ? ?userinfo: {
? ? ? ? ? ? ? ?firstName: '',
? ? ? ? ? ? ? ?lastName: '',
? ? ? ? ? ? ? ?fullName: ''
? ? ? ? ? }
? ? ? },
? ? ? ?watch: {
? ? ? ? ? ?userinfo: {
? ? ? ? ? ? ? ?// handler是固定的写法
? ? ? ? ? ? ? ?handler(val) {
? ? ? ? ? ? ? ? ? ?this.userinfo.fullName = val.firstName + ' ' + val.lastName
? ? ? ? ? ? ? ? ? ?// 对象支持引用传值
? ? ? ? ? ? ? ? ? ?val.fullName = val.firstName + ' ' + val.lastName
? ? ? ? ? ? ? },
? ? ? ? ? ? ? ?deep: true
? ? ? ? ? }
? ? ? }
? })
</script>
面试题:vue中计算属性与监听器有什么区别??
3、综合案例:完善购物车进一步需求:
4、自定义指令 - directive[directive] ?https://cn.vuejs.org/v2/guide/custom-directive.html? 除了核心功能默认内置的指令,Vue也允许开发者注册自定义指令。有的情况下,对普通DOM元素进行底层操作,这时候就会用到自定义指令绑定到元素上执行相关操作。 自定义指令分为:全局指令和局部指令,当全局指令和局部指令同名时以局部指令为准(局部指令的优先级高于全局的)。 问题:全局与局部有什么区别?
自定义指令常用钩子函数(名字固定的函数)有:
全局指令语法 // 无参
Vue.directive('指令名',{
钩子函数名: function(el){
? ? ? ?// 业务逻辑
? // el参数是挂载到的元素的DOM对象
? // <div v-abc>123</div>
? }
}
?
// 传参
Vue.directive('指令名',{
钩子函数名: function(el,binding){
? let param = binding.value
? ? ? ?// 业务逻辑
? },
? ?....
}
局部自定义指令定义 可以在 directives: {
?指令名: {
? ?// 指令的定义
? ?钩子函数名: function (el,binding) {
? ? ?// 业务逻辑
? }
}
}
函数简写(了解,使用机会很少)
// 全局
Vue.directive('指令名', function (el,binding) {
?// 业务逻辑
})
?
// 局部
directives: {
?指令名: function (el,binding) {
? ? ?// 业务逻辑
}
}
案例:使用自定义指令实现以下效果
<div id="app">
? ?<div>
? ? ? ?<!-- 指令v-red,实现将文字的颜色设置成红色 -->
? ? ? ?<div v-red>武汉上演建党百年长江灯光秀</div>
? ? ? ?<!-- 指令v-color:实现将文字的颜色设置成指定的颜色 -->
? ? ? ?<div v-color="'blue'">将延长边境防疫管控1年?中方回应</div>
? ?</div>
? ?<div>
? ? ? ?<!-- 指令v-mobile:需要验证用户输入的手机号是否合法 -->
? ? ? ?<input type="text" v-model="mobile" v-mobile />
? ?</div>
</div>
<script src="./js/vue.js"></script>
<script>
? ?// 全局自定义指令
? ?Vue.directive("red", {
? ? ? ?// bind: function(el){
? ? ? ?// ? ? // el是指令绑定的dom对象
? ? ? ?// ? ? console.log(el);
? ? ? ?// ? ? // 获取父节点,当然当前bind的时候是获取不到的,因此为null
? ? ? ?// ? ? console.log(el.parentNode);
? ? ? ?// },
? ? ? ?inserted: function (el) {
? ? ? ? ? ?// el表示dom对象
? ? ? ? ? ?console.log(el);
? ? ? ? ? ?// el.parentNode表示其父节点
? ? ? ? ? ?console.log(el.parentNode);
? ? ? ? ? ?// 通过dom对象,设置颜色
? ? ? ? ? ?el.style.color = 'red'
? ? ? }
? });
? ?Vue.directive("color", {
? ? ? ?inserted: function (el, binding) {
? ? ? ? ? ?console.log(el, binding);
? ? ? ? ? ?// binding.value表示属性的值(该值不是看到的表达式,而是解析完后的值)
? ? ? ? ? ?el.style.color = binding.value
? ? ? }
? })
? ?new Vue({
? ? ? ?el: "#app",
? ? ? ?data: {
? ? ? ? ? ?mobile: ""
? ? ? },
? ? ? ?// 自定义指令:
? ? ? ?directives: {
? ? ? ? ? ?mobile: {
? ? ? ? ? ? ? ?// 定义需要使用的函数
? ? ? ? ? ? ? ?update: function (el) {
? ? ? ? ? ? ? ? ? ?// console.log(el);
? ? ? ? ? ? ? ? ? ?// 获取手机号
? ? ? ? ? ? ? ? ? ?let mobile = el.value
? ? ? ? ? ? ? ? ? ?// 正则表达式验证手机号是否合法
? ? ? ? ? ? ? ? ? ?if (/^1[3-9]\d{9}$/.test(mobile)) {
? ? ? ? ? ? ? ? ? ? ? ?el.style.color = "black"
? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ?el.style.color = "red"
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? }
? })
</script>
5、过滤器 - filter作用:格式化数据,比如将字符串格式化为首字母大写、将日期格式化为指定的格式等。
声明语法: // 全局过滤器
Vue.filter('过滤器名称',function(value[,arg1,arg2...]){
//过滤器业务逻辑
return ....
})
?
// 局部过滤器
el: '#app',
data: {},
filters: {
? ?过滤器名称: function(value[,arg1,arg2...]){
? ? ? ?return something
? },
? ?// ....
}
使用语法: <!-- 过滤器使用 -->
<div>{{msg | upper}}</div>
?
<!-- 过滤器允许连续使用,“前 → 后”按顺序执行 -->
<div>{{msg | upper | lower}}</div>
?
<!-- 过滤器支持在v-bind中使用 -->
<div v-bind:id='id | formatId'></div>
?
<!-- 过滤器支持传参 -->
<div>{{msg | mysub(1,2)}}</div>
案例:声明转字母为大写的全局过滤器和转字母为小写的局部过滤器并使用 <body>
? ?<div id="app">
? ? ? ?<h4>{{msg | toUpper}}</h4>
? ? ? ?<h4>{{msg | toLower}}</h4>
? ?</div>
</body>
?
<script src="./js/vue.js"></script>
<script type="text/javascript">
? ?// 全局过滤器:转字母为大写
? ?Vue.filter('toUpper',(val) => {
? ? ? ?return val.toUpperCase()
? })
?
? ?const vm = new Vue({
? ? ? ?el: '#app',
? ? ? ?data: {
? ? ? ? ? ?msg: 'HeLLo WoRld'
? ? ? },
? ? ? ?// 局部过滤器:转字母为小写
? ? ? ?filters: {
? ? ? ? ? ?toLower: (val) => {
? ? ? ? ? ? ? ?return val.toLowerCase()
? ? ? ? ? }
? ? ? }
? })
</script>
6、混入 - mixin混入(mixins)是一种分发Vue组件中可复用功能的非常灵活的方式。混入对象可以包含任意组件选项。当组件使用混入对象时,==所有混入对象(加的水)的选项将被混入该组件本身的选项(锅底)。== 通俗来讲,就是把一部分可复用的代码片段,加入到另一个代码中。 混入分为全局混入和局部混入。
示例:
<script src="./js/vue.js"></script>
<script type="text/javascript">
? ?// 定义一个混入对象(局部混入)
? ?var myMixin = {
? ? ? ?created: function () {
? ? ? ? ? ?this.hello();
? ? ? },
? ? ? ?methods: {
? ? ? ? ? ?hello: function () {
? ? ? ? ? ? ? ?console.log("hello from mixin!");
? ? ? ? ? },
? ? ? },
? ? ? ?computed:{
? ? ? ? ? ?....
? ? ? }
? };
? ?// Vue实例
? ?const vm = new Vue({
? ? ? ?mixins: [myMixin],
? });
</script>
<script src="./js/vue.js"></script>
<script type="text/javascript">
? ?// 全局混入
? ?Vue.mixin({
? ? ? ?created: function () {
? ? ? ? ? ?var myOption = this.myOption;
? ? ? ? ? ?if (myOption) {
? ? ? ? ? ? ? ?console.log(myOption);
? ? ? ? ? }
? ? ? },
? });
?
? ?new Vue({
? ? ? ?data: {
? ? ? ? ? ?myOption: "hello!",
? ? ? }
? });
</script>
7、生命周期生命周期:从vue实例产生开始到vue实例被销毁这段时间所经历的过程。 vue更像工具人,在整个过程中只会按照作者预设的程序去做事,不能由开发者去控制或者diy。如果这样开发时限制是比较多的,因此作者开放了生命周期,允许我们定义vue在特定的时候去做我们让其做的事情(钩子函数)。 每个 Vue 实例在被创建之前都要经过一系列的初始化过程。例如需要设置数据监听、编译模板、挂载实例到 DOM,在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,目的是给予用户在一些特定的场景下添加他们自己代码的机会。 vue2中一共有11个生命周期。 Vue生命周期的主要阶段:
关于8个生命周期涉及到的方法,可以参考Vue官网API:https://cn.vuejs.org/v2/api/#%E9%80%89%E9%A1%B9-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90 8、虚拟DOM与diff算法什么是虚拟DOM?
定义:指将真实的dom按照特定的语法转化(抽象)成一个js对象,这个js对象称之为虚拟dom。 什么是diff(different)算法? 差异比较算法的一种,把树形结构按照层级分解,只比较同级元素。不同层级的节点只有创建和删除操作
传统DOM操作:在一次操作中,往往会伴随多次个DOM节点更新,浏览器收到第一个DOM请求后并不知道还有若干次更新操作,因此会马上执行流程,最终执行若干次次。在后续找DOM坐标的时候,可能因为前期更新DOM导致了后续需要寻找的DOM坐标发生了变化。而操作DOM频繁还会出现页面卡顿,影响用户体验。 虚拟DOM+diff算法:若一次操作中有若干次更新DOM的动作,虚拟DOM不会立即操作DOM,而是将这若干次更新的diff内容保存到本地一个JS对象中,最终将这个JS对象一次性放到DOM树上,再进行后续操作,避免大量无谓的计算量。 建议:面试之前一定要去找下比较正规的理论性的东西。 9、双向数据绑定原理面试可能会被大概率问到,需要领悟其中的关键词“代理”、“Object.defineProperty(vue2)”、“Proxy(vue3)” 核心:数据订阅、数据劫持(代理) 当把一个普通的JavaScript对象传给Vue实例的data选项,Vue将遍历此对象所有的属性,使用Object.defineProperty把这些属性全部转为getter(获取)/setter(设置)。 Object.defineProperty(obj, prop, descriptor) // 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。 // 应当直接在Object构造器对象上调用此方法,而不是在任意一个Object类型的实例上调用。
示例代码: <body>
? ?<div id="app">
? ? ? ?<div>
? ? ? ? ? ?<!-- 输入框 -->
? ? ? ? ? ?<input type="text" id="inpt" οninput="changeVal(this.value)" />
? ? ? ?</div>
? ? ? ?<div id="content"></div>
? ?</div>
?
? ?<script>
? ? ? ?// 1. 定义数据源
? ? ? ?var data = {
? ? ? ? ? ?msg: "hello world.",
? ? ? };
? ? ? ?// 等同于之前的data属性
?
? ? ? ?// 2. 通过dom操作将数据写在页面上(一锤子买卖)
? ? ? ?document.getElementById("inpt").value = data.msg;
? ? ? ?document.getElementById("content").innerText = data.msg;
?
? ? ? ?// 3. 通过Object.defineProperty()去实现数据的劫持(代理)
? ? ? ?var obj = {};
? ? ? ?Object.defineProperty(obj, "proxy", {
? ? ? ? ? ?// 设置getter和setter
? ? ? ? ? ?// 代理获取数据
? ? ? ? ? ?get() {
? ? ? ? ? ? ? ?return data.msg;
? ? ? ? ? },
? ? ? ? ? ?// 代理设置数据
? ? ? ? ? ?set(val) {
? ? ? ? ? ? ? ?data.msg = val;
? ? ? ? ? ? ? ?document.getElementById("content").innerText = val;
? ? ? ? ? },
? ? ? });
?
? ? ? ?// 4. input事件的处理程序
? ? ? ?function changeVal(val){
? ? ? ? ? ?// console.log(val);
? ? ? ? ? ?// 更新数据源
? ? ? ? ? ?obj.proxy = val;
? ? ? }
? ?</script>
</body>
vue2与vue3双向数据绑定的实现比较参考: |
|
|
| JavaScript知识库 最新文章 |
| ES6的相关知识点 |
| react 函数式组件 & react其他一些总结 |
| Vue基础超详细 |
| 前端JS也可以连点成线(Vue中运用 AntVG6) |
| Vue事件处理的基本使用 |
| Vue后台项目的记录 (一) |
| 前后端分离vue跨域,devServer配置proxy代理 |
| TypeScript |
| 初识vuex |
| vue项目安装包指令收集 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年12日历 | -2025/12/9 4:45:29- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |