Vue 进阶之路(三)


Posted in Javascript onApril 18, 2019

之前的文章我们已经对 vue 有了初步认识,这篇文章我们通过一个例子说一下 vue 的方法 methods,计算属性 compited 和监听器 watch。

现在我们有一个需求,变量 firstName = "hello",变量 lastName = "world",我们需要将这两个变量拼接到在前端展示,最基本的我们可以想到的就是:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
  <p>{{firstName + " " + lastName}}</p>
  <p>{{firstName}} {{lastName}}</p>
</div>
<script>
  var app = new Vue({
    el: '#app',
    data: {
      firstName: 'hello',
      lastName: 'world',
    },
  })
</script>
</body>
</html>

以上两种写法很明显是可以这么做的,但是第一种我们在 {{ }} 插值表达式内进行了代码的计算,这是我们不建议使用方式,第二种是写两个 {{ }} 插值表达式,看起来效果不错,但是如果我们要再拼接多个的话在 HTML 代码中就显得冗余了,后期也不好维护。接下来我们看一下如何在方法内实现:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
  <p>{{fullName()}} {{time}}</p>
</div>
<script>
  var app = new Vue({
    el: '#app',
    data: {
      firstName: 'hello',
      lastName: 'world',
      time: 1
    },
    methods:{
      fullName(){
        console.log("计算了一次");
        return this.firstName + " " + this.lastName
      }
    }
  })
</script>
</body>
</html>

上面的代码我们在 methods 里定义了一个 fullName 的方法,然后通过 {{ }} 插值表达式放在 HTML 里,当页面加载的时候直接调用,运行结果如下:

Vue 进阶之路(三)

我们在页面加载的时候同时定义了一个 time 的数据,当我们更新这个 time 数据的时候,结果如下:

Vue 进阶之路(三)

我们发现当我们更新 time 数据的时候,fullName 方法也调用了一次。这显然不是很理想的。

我们再来看一下利用监听器 watch 方法:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
  <p>{{fullName}} {{time}}</p>
</div>
<script>
  var app = new Vue({
    el: '#app',
    data: {
      firstName: 'hello',
      lastName: 'world',
      fullName: 'hello world',
      time: 1
    },
    watch: {
      firstName() {
        console.log("firstName 更改了");
        this.fullName = this.firstName + " " + this.lastName;
      },
      lastName() {
        console.log("lastName 更改了");
        this.fullName = this.firstName + " " + this.lastName;
      }
    }
  })
</script>
</body>
</html>

结果如下:

Vue 进阶之路(三)

我们在 Vue 实例的 watch 属性里定义了两个方法 firstName 和 lastName,watch 属性中方法名和 data 属性里的数据变量名相同,表示会实时监听该数据的变化,如果监听到变化时会实时更新 DOM。

我们先来看一下当跟 methods 方法那样更新 time 数据时的变化:

Vue 进阶之路(三)

我们可以看出当 time 数据更新时并没有调用 firstName 和 lastName 里的数据。当我们更新 firstName 和 lastName 的数据时,结果如下:

Vue 进阶之路(三)

我们可以看出当我们更新 firstName 或者 lastName 的数据时,fullName 数据才会更新,这说明当数据挂载到 DOM 上的时候会缓存起来,如果数据不更新,则还会继续使用缓存的数据,当数据更新时才会调用 watch 里面的方法,这就比 methods 的方法要好很多。

我们再来看一下计算属性 computed:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
  <p>{{fullName}} {{time}}</p>
</div>
<script>
  var app = new Vue({
    el: '#app',
    data: {
      firstName: 'hello',
      lastName: 'world',
      time: 1
    },
    computed:{
      fullName(){
        console.log("计算了一次");
        return this.firstName + " " + this.lastName;
      }
    }
  })
</script>
</body>
</html>

运行结果如下:

Vue 进阶之路(三)

我们可以看出跟 watch 比,我们并没有在 data 里定义 fullName 数据,而是在 computed 属性里直接定义 fullName 然后 return 出 firstName 和 lastName 的拼接结果,当页面呈现时,从输出结果可以看出会走一次计算属性,当我们改变 time 数据时:

Vue 进阶之路(三)

可以看出 computed 里的方法没有被调用,当我们改变 firstName 或者 lastName 的数据时,结果如下:

Vue 进阶之路(三)

从上面的结果可以看出 computed 里面的方法被调用了,这是我们想要的结果,当跟 fullName 有关的 firstName 和 lastName 数据改变时计算属性才会重新计算,当跟 fullName 无关的 time 数据变化时会用之前缓存的数据,这正是我们想要的结果。

以上三种方法进行比较我们可以得知 methods 方法是最不理想的,监听器 watch 和 计算属性 computed 两种方法的运行结果是一样的,但是 计算属性 computed 方法更简单一些。所以在 watch 和 computed 两种方法都能实现的时候我们更推荐使用 computed 方法。

但是上面的 watch 和 computed 两个方法里有个问题,就是 watch 里我们在 data 里定义了一个 fullName 的数据,当我们在更改 fullName 的值时 DOM 会跟着改变,这个跟 firstName 和 lastName 数据更改是一样的。但是当我们在 computed 里我们并没有定义 fullName,当我们更改 fullName 的数据时,如下:

Vue 进阶之路(三)

我们发现 DOM 并没有更新,这跟 watch 比起来就显得不友好了,其实在 computed 里有 get 和 set 两个属性,我们 computed 的 fullName 方法改成如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
  <p>{{fullName}} {{time}}</p>
</div>
<script>
  var app = new Vue({
    el: '#app',
    data: {
      firstName: 'hello',
      lastName: 'world',
      time: 1
    },
    computed: {
      fullName: {
        get() {
          console.log("计算了一次");
          return this.firstName + " " + this.lastName;
        },
        set(value) {
          console.log(value);
          var result = value.split(" ");
          this.firstName = result[0];
          this.lastName = result[1];
        }

      }
    }
  })
</script>
</body>
</html>

运行结果如下:

Vue 进阶之路(三)

可以看出当我们通过 get 和 set 就可以改变 fullName 的值使 DOM 更新了。当页面更新的时候先触发 fullName 中的 get 方法,并返回 fullName,当我们改变 time 时,fullName 所依赖的 firstName 和 lastName 并没有更改,所以就 fullName 就会去取缓存的值,在 fullName 的 set 方法里可以传一个 value 的参数,通过打印我们可以看出 value 值就是我们直接改变 fullName 的值,我们就可以通过该值来赋值改变 firstName 和 lastName,这样 fullName 所依赖的 firstName 或 lastName 改变时 DOM 就会实时更新了。

以上所述是小编给大家介绍的Vue 进阶之路详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery 插件模板 制作jquery插件的朋友可以参考下
Mar 17 Javascript
热点新闻滚动特效的js代码
Aug 17 Javascript
javascript 实现键盘上下左右功能的小例子
Sep 15 Javascript
jQuery获取和设置表单元素的方法
Feb 14 Javascript
超棒的响应式布局jQuery插件Freetile.js
Nov 17 Javascript
jQuery+ajax实现文章点赞功能的方法
Dec 31 Javascript
浅谈JS使用[ ]来访问对象属性
Sep 21 Javascript
详解Vue单元测试Karma+Mocha学习笔记
Jan 31 Javascript
Node.js Express安装与使用教程
May 11 Javascript
Vue+mui实现图片的本地缓存示例代码
May 24 Javascript
ES6 Array常用扩展的应用实例分析
Jun 26 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
Oct 15 Javascript
Vue自定义全局Toast和Loading的实例详解
Apr 18 #Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 #Javascript
在element-ui的select下拉框加上滚动加载
Apr 18 #Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 #Javascript
vue模式history下在iis中配置流程
Apr 17 #Javascript
详解Vue 全局变量,局部变量
Apr 17 #Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
Apr 17 #Javascript
You might like
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
php实现的双色球算法示例
2017/06/20 PHP
实例讲解php实现多线程
2019/01/27 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
JS去除右边逗号的简单方法
2013/07/03 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
微信小程序实现收藏与取消收藏切换图片功能
2018/08/03 Javascript
JS实现图片切换效果
2018/11/17 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python模块之StringIO使用示例
2015/04/08 Python
Python 含参构造函数实例详解
2017/05/25 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
如何查看python关键字
2021/01/17 Python
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
集团薪酬管理制度
2014/01/13 职场文书
股权投资意向书
2014/04/01 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
python实现网络五子棋
2021/04/11 Python