Vue.js-----轻量高效的MVVM框架(五、计算属性)

#基础例子

<div id="dr01">
    <h4>#基础例子</h4>
    <div>
        num01={{num01}}, num02={{num02}}
        <p>num01: vm定义的属性,num02:计算出来的属性</p>
    </div>
</div>
var dr01 = new Vue({
    el: "#dr01",
    data: {
        num01: 10,
    },
    computed: {
        num02: function() {
            return this.num01 * 5;
        }
    }
})

在js中定义组件dr01,初始化数据num01:10,computed中定义了num02(一个返回值为num01*5的方法)。

在页面中,{{num01}}为我们定义{{num02}}为计算出来的结果:

    

#计算属性vue.$watch

<div id="dr02">
    <h4>#计算属性vue.$watch</h4>
    <div>
        <span>FirstName01: </span><input type="text" v-model="firstName01" />
        <br />
        <span>LastName01: </span><input type="text" v-model="lastName01" />
        <br />
        <span>FullName01: </span><input type="text" readonly="readonly" v-model="fullName01" disabled="disabled" />
    </div>
    <br />
    <div>
        <span>FirstName02: </span><input type="text" v-model="firstName02" />
        <br />
        <span>LastName02: </span><input type="text" v-model="lastName02" />
        <br />
        <span>FullName02: </span><input type="text" readonly="readonly" v-model="fullName02" disabled="disabled" />
    </div>
</div>
var dr02 = new Vue({
    el: "#dr02",
    data: {
        firstName01: "Dark",
        lastName01: "Ranger",
        fullName01: "Dark Ranger",
        firstName02: "Slight",
        lastName02: "Wind"
    },
    computed: {
        fullName02: function() {
            return this.firstName02 + " " + this.lastName02;
        }
    }
});
dr02.$watch("firstName01", function(val) {
    this.fullName01 = val + " " + this.lastName01;
});
dr02.$watch("lastName01", function(val) {
    this.fullName01 = this.firstName01 + " " + val;
});

双向数据绑定的时候我们经常会遇到这样的情况:数据3=数据1+数据2,我们单独更新数据1或者数据2以后,数据3需要实时更新。这里我们有两种解决方案,但是肯定推荐第二种计算属性,为什么,简单!!!

1、在data中定义firstName01: "Dark",lastName01: "Ranger",为了初始化数据的时候fullName01也一样,同样定义fullName01: "Dark Ranger"

为了实时更新数据fullName01,我们需要对firstName01和lastName01进行观察,即加上dr02.$watch语句。

2、在data中定义firstName02: "Slight",lastName02: "Wind",对fullName02我们采用计算属性的方式:把fullName02定义为一个返回值为firstName02+lastName02的方法,这样,当firstName02或者lastName02发生数据变更的时候,fullName02通过计算属性也会发生变化,进行实时更新。

  初始化数据

    

  firstname或者lastname数据更新后

    

#计算setter

上面的例子,我们考虑个问题,是的,当firstname或者lastname数据更新的时候,fullname数据也会更新;但是,当fullname数据发生变化的时候firstname和lastname并不会更新,因为在方式1中我们没有对fullname加入观察,如果加入观察,是可以更新,但是我们要更新10000条数据,也就要写对10000个数据进行观察的$watch方法,这里我们在方式2中对数据fullname加入get和set方法即可。

方式2的gettter和setter

<div id="dr03">
    <h4>#计算setter</h4>
    <span>FirstName: </span><input type="text" v-model="firstName" />
    <br />
    <span>LastName: </span><input type="text" v-model="lastName" />
    <br />
    <span>FullName: </span><input type="text" v-model="fullName" />
</div>
var dr03 = new Vue({
    el: "#dr03",
    data: {
        firstName: "Zhang",
        lastName: "Yao"
    },
    computed: {
        fullName: {
            get: function() {
                return this.firstName + " " + this.lastName;
            },
            set: function(newValue) {
                var names = newValue.split(" ");
                this.firstName = names[0];
                this.lastName = names[1];
            }
        }
    }
})

初始化数据:

  

当firstname、lastname、fullname中的一个发生变化的时候,其他数据也会实时更新

  

完整代码 如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <script type="text/javascript" src="js/vue.js"></script>
        <title>计算属性</title>
    </head>

    <body>
        <div id="dr01">
            <h4>#基础例子</h4>
            <div>
                num01={{num01}}, num02={{num02}}
                <p>num01: vm定义的属性,num02:计算出来的属性</p>
            </div>
        </div>
        <div id="dr02">
            <h4>#计算属性vue.$watch</h4>
            <div>
                <span>FirstName01: </span><input type="text" v-model="firstName01" />
                <br />
                <span>LastName01: </span><input type="text" v-model="lastName01" />
                <br />
                <span>FullName01: </span><input type="text" readonly="readonly" v-model="fullName01" disabled="disabled" />
            </div>
            <br />
            <div>
                <span>FirstName02: </span><input type="text" v-model="firstName02" />
                <br />
                <span>LastName02: </span><input type="text" v-model="lastName02" />
                <br />
                <span>FullName02: </span><input type="text" readonly="readonly" v-model="fullName02" disabled="disabled" />
            </div>
        </div>
        <div id="dr03">
            <h4>#计算setter</h4>
            <span>FirstName: </span><input type="text" v-model="firstName" />
            <br />
            <span>LastName: </span><input type="text" v-model="lastName" />
            <br />
            <span>FullName: </span><input type="text" v-model="fullName" />
        </div>
        <script>
            var dr01 = new Vue({
                el: "#dr01",
                data: {
                    num01: 10,
                },
                computed: {
                    num02: function() {
                        return this.num01 * 5;
                    }
                }
            })
            var dr02 = new Vue({
                el: "#dr02",
                data: {
                    firstName01: "Dark",
                    lastName01: "Ranger",
                    fullName01: "Dark Ranger",
                    firstName02: "Slight",
                    lastName02: "Wind"
                },
                computed: {
                    fullName02: function() {
                        return this.firstName02 + " " + this.lastName02;
                    }
                }
            });
            dr02.$watch("firstName01", function(val) {
                this.fullName01 = val + " " + this.lastName01;
            });
            dr02.$watch("lastName01", function(val) {
                this.fullName01 = this.firstName01 + " " + val;
            });
            var dr03 = new Vue({
                el: "#dr03",
                data: {
                    firstName: "Zhang",
                    lastName: "Yao"
                },
                computed: {
                    fullName: {
                        get: function() {
                            return this.firstName + " " + this.lastName;
                        },
                        set: function(newValue) {
                            var names = newValue.split(" ");
                            this.firstName = names[0];
                            this.lastName = names[1];
                        }
                    }
                }
            })
        </script>
    </body>

</html>
时间: 2024-07-29 14:45:01

Vue.js-----轻量高效的MVVM框架(五、计算属性)的相关文章

Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据)

#使用props传递数据 html:传递普通的字符串 <h3>#使用props传递数据</h3> <div id="dr01"> <div>组件实例的作用域是孤立的.这意味着不能并且不应该在子组件的模板内直接引用父组件的数据.可以使用 props 把数据传给子组件.</div> <br /> <child msg="hello, vue.js!"></child> <

Vue.js-----轻量高效的MVVM框架(七、表单控件绑定)

话不多说,先上完整代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script type="text/javascript" src="js/vue.js"></script> <title></title> </head> <body> <h2>表

Vue.js 实战教程 V2.x(7)计算属性和侦听器

7计算属性和侦听器 7.1计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的. 在模板中放入太多的逻辑会让模板过重且难以维护. 所以,对于任何复杂逻辑,你都应当使用计算属性. 基础例子 <div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMe

Vue.js-----轻量高效的MVVM框架(十一、使用slot分发内容)

#单个slot html: <h3>#单个slot</h3> <!-- 定义child01模板 --> <template id="child01"> <div>this is temp01 component!</div> <slot> 如果没有分发内容,这里将会被显示 </slot> </template> <div id="dr01"> &l

js实现一个简单的MVVM框架

以前都是默默地看园子里的文章,猥琐的点赞,今天也分享一下自己用js实现的一个简单mvvm框架. 最初只做了自动绑定事件,后面又参考学习了vue,knouckout以及argular实现方式,以及结合自己做WPF的一些经验,增加了属性绑定,今天又稍微整理了下,完善了部分功能,把代码提交到了码云:https://gitee.com/zlj_fy/Simple-MVVM 先简单介绍下用法: 1 <form class="form-horizontal" role="form&

mobi.css 轻量灵活的CSS框架

Mobi.css是一个专用于手机的轻量灵活的CSS框架(基础教程qkxue.net). 介绍 1. 压缩后只有3.6kb,低于Skeleton, Pure.css , Bootstrap v4等. 2. 大量使用 flexbox,非常灵活,主页自定义样式少于10行. 3. 专用于手机,桌面显示手机界面(手机app开发ty300.com),侧边栏显示向左或向右滑动键. 入门 您可在此界面下载该应用,可通过dist/mobi.min.css压缩文件. 可通过npm安装: npm install --

Vue.js:轻量高效的前端组件化方案(转载)

摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue.js做一个深入的介绍. Vue.js 是我在2014年2月开源的一个前端开发库,通过简洁的 API 提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在 GitHub上已经有5000+的star.本文将从各方面对Vue.js做一个深入的介绍. 开发

加速开发的最轻量的PHP数据库框架 Medoo

为什么选择 Medoo? -非常的轻量 只有 15KB,只需include即可. -简单 非常的容易学习,快速上手. -强大 支持各种常见的SQL查询. -兼容 支持各种数据:MySQL, MSSQL, SQLite, MariaDB, Oracle, Sybase, PostgreSQL. -安全 防止SQL注入 -免费 MIT 协议, 你可以进行任何修改. 必须 PHP 5.1以上,非常.特别.极其.强烈推荐:使用PHP 5.4以上版本并开启PDO支持. 你可以安装MySQL,MSSQL,S

2016年31款轻量高效的开源JavaScript插件和库

目前有很多网站设计师和开发者喜欢使用由JavaScript开发的插件和库,但同时面临一个苦恼的问题:它们中的大多数实在是太累赘而且常常降低网站的性能.其实,其中也有不少轻量级的插件和库,它们不仅轻巧有用,而且不会影响网站的性能.本文就为大家整理了2016年以来30多款轻量级Javascript插件和库的列表,这些工具服务于特定的目标,并且它们能够非常有效和高效地实现目标. 不管你想创建一个图片库.一个滑动效果,个性化菜单还是其他接口元素,你都可以用这些插件和库轻易的实现.同时,你还可以使用这些插