分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

Vue.js 创建一个 CNODE 社区(2)

发布时间:2023-09-06 02:16责任编辑:蔡小小关键词:js

还是继续入门 demo

这篇博文应该有点长,因为觉得了解了 computed 之后,应该还会继续学下去,所以这里会包含 computed 和 v-bind 的相关学习内容。


computed

什么是计算属性

所有的计算属性都以函数的形式写在 Vue 实例内的computed 选项内,最终返回计算后的结果。

为什么使用计算属性以及如何使用

逻辑过长,会变的臃肿,难以维护。

使用计算属性可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果即可。

如计算一个购物车总价:

计算属性还可以依赖多个 Vue 实例的数据

计算属性还可以依赖多个 Vue 实例的数据,只要其中任一数据变化,计算属性就会重新执行,视图也会更新

我们声明了一个新的 Vue 实例 app2,然后在 app 中的计算属性 prices 中调用 app2 中的属性:

var app2 = new Vue({ ?el:‘#app2‘, ?data:{ ???msg:‘ this\‘s app2‘ ?}})var app = new Vue({ ?el:‘#app‘, ?data:{ ???text:‘123,456,789‘, ???package:[ ?????{ ???????package1:{ ?????????name:‘iphone‘, ?????????price:6900, ?????????count:2 ???????}, ???????package2:{ ?????????name:‘ipad‘, ?????????price:5900, ?????????count:3 ???????} ?????} ???] ?}, ?//定义计算属性 ?computed:{ ???reverseText:function(){ ?????// this 代表了这个 Vue 实例 ?????return this.text.split(‘,‘).reverse().join(‘,‘) ???}, ???prices:function(){ ?????var price = 0 ???????for(let key in this.package[0]){ ?????????price += this.package[0][key].price*this.package[0][key].count ???????} ?????return price + app2.msg ???} ?}})

计算属性中的 getter 和 setter

每一个计算属性都包含-个 getter 和一个 setter。

如果计算属性直接跟一个 function,默认的就是 getter ,如上面那几个例子。

如果计算属性设置 getter 和 setter,同时给计算属性设置值的时候,他就会根据 setter 先拿到新数据,处理过之后,再交由 getter 处理:

计算属性和 methods 的区别

调用 methods 里的方法也可以与计算属性起到同样的作用。那他们有什么区别呢?

通过 demo 来理解,使用不同的方法获取时间戳,我们在 methods 中定义一个方法:

methods:{ ???thisTime:function(){ ???????return Date.now() ???}}

在 computed 中定义一个属性:

computed:{ ???nowTime:function(){ ???????return Date.now() ???}}

在页面中显示出来:

<!--下面使用了 计算属性-->{{ nowTime}}<br><!--下面使用了 methods-->{{ thisTime() }}

第一次渲染:

通过给 app.text 重新赋值,再次渲染:

可以看到,在渲染后,通过 methods 获取到的数据发生了改变;而计算属性获取到的数据并没有发生改变。

注意 渲染是渲染,页面刷新是刷新;页面刷新,一定会重新渲染;页面重新渲染,页面不一定要刷新。

methods 方法: 如果是调用方法,只要页面重新渲染。方法就会重新执行,不需要渲染,则不需要重新执行

计算属性:不管渲染不渲染,只要计算属性依赖的数据未发生变化,就永远不变,计算属性是依赖于缓存的。

如何选择 methods 和计算属性:

是否需要缓存,需要缓存,选择计算属性;不需要缓存,使用 methods。


小总结

JSbin 代码链接

  • 创建以一个vue实例,并使用计算属性和方法实现一个字符串翻转的操作,写出核心代码

HTML:

<div id="app"> ???{{ textReverse() }} ???{{ textReverse2 }}</div>

JS:

var app = new Vue({ ???el:‘#app‘, ???data:{ ???????text:‘reverse text‘ ???}, ???methods:{ ???????textReverse:function(){ ???????????return this.text.split(‘‘).reverse().join(‘‘) ???????} ???}, ???computed:{ ???????textReverse2:function(){ ???????????return this.text.split(‘‘).reverse().join(‘‘) ???????} ???}})
  • 何时使用模板内表达式,何时使用计算属性

当表达式所需的逻辑链较短,数据处理需求不大时,可以使用模板内表达式。

当逻辑链变长,逻辑更为复杂时,使用计算属性。

  • 计算缓存 vs Methods,两者的区别

调用 methods 里的方法可以与计算属性起到同样的作用。

他们的区别在于:

methods 方法: 如果是调用方法,只要页面重新渲染。方法就会重新执行,不需要渲染,则不需要重新执行

计算属性:不管渲染不渲染,只要计算属性依赖的数据未发生变化,就永远不变,计算属性是依赖于缓存的。

  • 代码题

实例化一个vue实例,在data中定义一个姓氏firstName和名字firstName,还有一个全称叫fullName。

提示:fullName = firstName + firstName。

需求:分别使用watch监听器和计算属性来实现以下功能实现,只要姓氏firstName和名字firstName中的任意一个改变,全称fullname就会改变

老师真鸡贼...还没有看到 watch 呐哈哈,还是得去预习一下再做这道题了:

HTML:

<div id="app"> ???{{ fullName }}</div>

computed:

var app = new Vue({ ???el:‘#app‘, ???data:{ ???????firstName:‘Zhang‘, ???????lastName:‘da‘, ???????fullName:‘Zhang da‘ ???}, ???computed:{ ???????fullName:{ ???????????get:function(){ ???????????????return this.firstName + ‘ ‘ + this.lastName ???????????}, ???????????set:function(newValue){ ???????????????let name = newValue.split(‘,‘) ???????????????this.firstName = name[0] ???????????????this.lastName = name[1] ???????????} ???????} ???},})

watch:

var app = new Vue({ ???el:‘#app‘, ???data:{ ???????firstName:‘Zhang‘, ???????lastName:‘da‘ ???}, ???watch:{ ???????firstName:function(val,oldVal){ ???????????this.fullName = val + ‘ ‘ + this.lastName ???????????console.log(oldVal) ???????}, ???????lastName:function(val,oldVal){ ???????????this.fullName = this.firstName + ‘ ‘ + val ???????????console.log(oldVal) ???????} ???}})

v-bind

动态地绑定一个或多个特性,或一个组件 prop 到表达式。

在绑定 class 或 style 特性时,支持其它类型的值,如数组或对象。

之前在 (1) 已经略微了解过 v-bind,现在来更深入地了解一下他的用法。

绑定 class - 对象

绑定 class 对象语法,对象的键是类名,值是布尔值。

绑定 class - 计算属性

当 class 的表达式过长或逻辑复杂时,还可以绑定一个计算属性

active 就是类名,他是否会启用,取决于他的值是否为 true。当 this.isActive 为 true 且 !this.isBorder 也为 true 时,这个样式才能显示出来。

绑定 class - 数组

绑定 class 数组,数组中的成员 对应着 类名

数组和对象混用

把对象写入数组中,如:

HTMl:

<div :class=‘[{borderStyle:isActive},"className"]‘></div>

JS:

var app = new Vue({ ???el:‘#app‘, ???data:{ ???????isActive:true, ???????className:‘lineStyle‘ ???}})

CSS:

.lineStyle{ ???line-height:666px;}

绑定内联样式

还可以绑定内联样式:

<div v-bind:style="{ color: activeColor, fontSize: fontSize + ‘px‘ }"></div>
data: { ?activeColor: ‘red‘, ?fontSize: 30}

还可以直接绑定到一个样式对象:

<div v-bind:style="styleObject"></div>
data:{ ???styleObject:{ ???????color:"red", ???????fontSize:"30px" ???}}

关于 v-bind 的 demo 详见 JSbin


小总结

  • 写出本课中v-bind的作用,并分别写出v-bind的变量语法,数组语法,对象语法

作用:通过数据绑定操作元素的 class 列表和内联样式

变量语法: v-bind:class=变量名,变量名在 Vue 实例里的 data 对象内定义,变量的赋值内容则是类名。

数组语法: v-bind:class=[数组成员],可以绑定多个 class,数组成员可以是对象,如果是对象的话,这个对象的值为 true ,这个 class 才可以会被使用;如果是数组成员是变量,则需要的 Vue 实例里的 data 对象内设置变量,变量的赋值内容则是类名。

对象语法: v-bind:class = {类名:布尔值},通过判断布尔值,来确定 class 是否被启用。

变量语法

HTML:

<div :href=‘url‘></div>

JS:

data:{ ???url:‘http://www.acfun.cn/‘}

数组语法

HTML:

<div :class=‘[className1,className2]‘></div>

JS:

data:{ ???className1:‘divStyle‘, ???className2:‘borderStyle‘}

对象语法

HTML:

<div :class=‘{divStyle:isActive}‘></div>

JS:

data:{ ???isActive:true}

绑定计算属性:

HTML:

<div :class=‘className‘></div>

CSS:

.active{ ???color:red;}

JS:

...data:{ ???isActive:true, ???isBorder:true},computed:{ ???className:function(){ ???????return { ???????????active: this.isActive || isBorder ???????} ???}}

本篇博文到此结束,主要学习了计算属性 computed 和 v-bind 的一些用法,其实 Vue 的官方文档里面也有相关的教程,但是老师讲得也是十分详细,对照着看很容易理解,多写 demo 也增加了对 Vue 的认识。

Vue.js 创建一个 CNODE 社区(2)

原文地址:https://www.cnblogs.com/No-harm/p/9716024.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved