目录

1.vue介绍

1.1 什么是vue

1.2 vue的优点

2. 库和框架的区别

2.1 库

2.2 框架

3. MVVM

4. 安装vue

5.开发示例

5.1 vue实例

5.2 绑定事件

5.3 Vue双向数据绑定

6. Vue生命周期钩子

6.1推荐一个浏览器监测vue插件 谷歌版 !

7. 模板语法

1.1 插值

1.1.1 文本

1.1.2 html

1.1.3 属性

1.1.4 表达式

1.2 指令

1.2.1 核心指令

1.2.1.1 v-if |v-else-if|v-else

1.2.1.4 v-on|v-model|v-for

2. 过滤器

2.1 局部过滤器

2.2 全局过滤器

3. 计算属性

4.监听属性


1.vue介绍

1.1 什么是vue

vue是一个构建用户界面UI的渐进式javascript框架,渐进式的框架是指可以一步一步的由浅入深的去使用这个框架,该框架可以逐步引入项目。作者:尤雨溪

vue官网 Vue.js - 渐进式 JavaScript 框架 | Vue.js

1.2 vue的优点

1.体积小 压缩后33k左右,体积小意味着下载速度很快。

2.更高的运行效率 基于虚拟dom,一种预先通过javascript进行各种计算,把最终的DOM操作计算出来并进行优化的技术。所谓虚拟dom指的是对真实dom的一种模拟。相对于直接操作真实dom,我们构建一棵虚拟的dom树,将各式数据和操作直接应用到这颗虚拟的dom树上,然后再虚拟的树修改应用到真实的dom树中,有助于减少dom的操作次数,带来性能上的提升,可以频繁的操作虚拟节点,然后一定时刻一次性的同步修改到真实dom节点

3.双向数据绑定 让开发者不用再去操作dom对象,把更多精力投入到业务逻辑上来

4.生态丰富,学习比较简单 市场上有很多稳定成熟的基于vue的ui框架可以拿来使用,实现快速开发。中国人开发的,中文资料丰富。

2. 库和框架的区别

2.1 库

本质上是一些函数的集合。每次调用函数,实现一个特定的功能,接着把控制权交给使用者,js中最典型的是jQuery,jquery本质上是封装dom操作,简化dom操作的工具库

2.2 框架

框架是一套完整的解决方案,使用框架是需要遵循框架的规则,将代码放入框架的合适位置,框架在合适的时候调用代码。代表Vue。一种框架会规定自己的编程方式,侵入性较高。

3. MVVM

MVVM,一种更好的UI模式解决方案,MVVM通过数据双向绑定让数据自动地双向同步

标题解释
MVVMM-V-VM
MModel数据模型,json格式的数据
Vview视图,JSP,HTML
VMViewModel视图模型,把Model和View关联起来的就是ViewModel,ViewModel负责把Model的数据同步到View显示出来, 还负责把View的修改同步回Model

虽然没有完全遵循MVVM模型,Vue的设计无疑受到了它的启发。另外一个js框架“knockout”完全遵循MVVM模型 学习Vue要转化思想:“不要在想着怎么操作DOM,而是想着如何操作数据!!!”

4. 安装vue

  1. cdn下载(需要网络) <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

  2. <!-- 生产环境版本,优化了尺寸和速度 --> <script src="https://cdn.jsdelivr.net/npm/vue"></script>

  3. 手动下载 <!-- 开发环境版本,包含了有帮助的命令行警告 -->

    <script src="dist/vue.js"></script>

    <!-- 生产环境版本,优化了尺寸和速度 -->

    <script src="dist/vue.min.js"></script>

CDN加速 CDN的全称是Content Delivery Network,即内容分发网络,CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。CDN加速主要是加速静态资源,如网站上面上传的图片、媒体,以及引入的一些Js、css等文件。CDN加速需要依靠各个网络节点,例如100台CDN服务器分布在全国范围,从上海访问,会从最近的节点返回资源,这是核心。CDN服务器通过缓存或者主动抓取主服务器的内容来实现资源储备。CDN基本原理:将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。 CDN部署在网络提供商的机房,是用户在请求网络服务的时候,可以从距离最近的网络提供商机房获取数据。 最大的优势就是可以让用户就近访问资源.

BootCDN BootCDN是Bootstrap中文网支持并维护的前端开源项目免费CDN服务,致力于为Bootstrap、jQuery、Angular、Vuejs一样优秀的前端开源项目提供稳定、快速的免费 CDN 加速服务

官网 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务

5.开发示例

vue有两种开发方式,一种是直接页面开发,一种是工程级开发,本示例使用的是直接页面开发方式。

5.1 vue实例

  1. 每个Vue应用都是通过用Vue构造器创建一个新的Vue实例开始的。

  2. 需要给vue指定一个内容管理区,通常我们也把它叫做边界,这意味着我们接下来的改动全部在指定的div内,div外部不受影响。

  3. 双花括号叫做插值

<div id="app">
    <h1>{{msg}}, {{ts}}</h1>
</div>

<script>
​
//创建vue实例
var vm = new Vue({
    //指定管理区域
    el: '#app',
    data: {
        msg: 'hello vue'
    }
});
    </script>

可以将div中的id属性改一个名称,查看一下信息是否还能正常输出,体会一下vue内容管理区的概念还特点。

data属性既可以是一个json对象也可以是一个函数,如:

var vm = new Vue({
    el: '#app',
    data: function(){
        return {
            msg: 'hello vue',
            ts: new Date().getTime()
        }
    }
});

注意:data在组件开发中的写法必须是函数。

5.2 绑定事件

  1. var vm = new Vue({
        el: '#app',
        
        data: function(){
            return {
                msg: 'hello vue',
                ts: new Date().getTime()
            }
        },

    vue指令:指的是是带有“v-”前缀的特殊属性

  2. vue实例的methods用来定义交互事件使用的函数,函数名不限制

示例:

   
    //定义交互事件
    methods: {
        clickme: function(){
            console.log('点到我了');
        }
    }
});
​
<div id="app">
    <h1>{{msg}}, {{ts}}</h1>
    <!-- v-on:  vue绑定事件的处理函数的方式 -->
    <button v-on:click="clickme()">点我试试</button>
</div>

打开开发者工具,点击按钮,在console中查看点击事件的效果。

5.3 Vue双向数据绑定

双向数据绑定,指的是数据的改变会引起dom的改变,dom的改变也是引起数据的改变。 示例:

<div id="app">
    <input type="text" v-model="msg"  @keyup="change()">
    <button  v-on:click="setVal">改变值</button>
</div>
var vm = new Vue({
    //指定vue实例的管理区域,也叫边界
    el: "#app",
            
    data: function() {
        return {
            msg: 'hello vue'
        }
    },
    
    methods: {
        change: function() {
            console.log(this.msg);
        },
        setVal: function() {
            this.msg = 'hello hello';
        }
    }
 });

打开开发者工具,在文本框中输出数据,观察console中的输出,可以看到数据双向绑定的效果。

注意点

  1. 只有当实例被创建时已经在data中存在的属性才是响应式的

  2. 用v-model指令在表单控件元素上创建双向数据绑定

  3. this在methods属性的方法里指向当前Vue实例,如果需要外部访问可以使用vm.name/vm.$data.name的方式

  4. 用v-once指令进行单向绑定,一般不用

  5. console对象可以使用printf风格的占位符。只支持字符(%s)、整数(%d或%i)、浮点数(%f)和对象(%o)四种

  6. Vue实例还暴露了一些有用的实例属性与方法。它们都有前缀$,以便与用户定义的属性区分开来

6. Vue生命周期钩子

生命周期钩子示例已经在资料中提供,将demo4.html拷入项目即可。通过该示例了解vue常用的生命周期钩子,及其作用。 每个Vue实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到DOM并在数据变化时更新DOM等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

生命周期函数:

名称作用
beforeCreate第一个生命周期函数,表示实例完全被创建出来之前,会执行它。 注意: 在 beforeCreate 生命周期函数执行的时候,data 和 methods 中的 属性与方法定义都还没有没初始化
created第二个生命周期函数,在 created 中,data 和 methods 都已经被初始化好了! 如果要调用 methods 中的方法,或者操作 data 中的数据,最早,只能在 created 中操作
beforeMount第三个生命周期函数,表示 模板已经在内存中编辑完成了,但是尚未把模板渲染到页面中。在 beforeMount 执行的时候,页面中的元素,还没有被真正替换过来,只是之前写的一些模板字符串
mounted第四个生命周期函数,表示,内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了,注意: mounted 是 实例创建期间的最后一个生命周期函数,当执行完 ##mounted 就表示,实例已经被完全创建好了,此时,如果没有其它操作的话,这个实例,就静静的 躺在我们的内存中,一动不动。此时,表示vue实例已经初始化完毕了,组建已脱离创建阶段,进入运行阶段了。接下来的是运行中的两个事件
beforeUpdate这时候,表示 我们的界面还没有被更新
updatedupdated 事件执行的时候,页面和 data 数据已经保持同步了,都是最新的
beforeDestroy销毁之前执行,当beforeDestroy函数执行时,表示vue实例已从运行阶段进入销毁阶段,vue实例身上所有的方法与数据都处于可用状态
destroyed当destroy函数执行时,组件中所有的方法与数据已经被完全销毁,不可用
activated页面出现的时候执行 activated生命周期函数,跟 监听 watch 有类似的作用
deactivated页面消失的时候执行

实例演示:

<!DOCTYPE html>
<html>
<head>
    <title>钩子函数</title>
    <meta charset="utf-8">
    <script src="js/v2.6.10/vue.js"></script>
<body>
​
<div id="app">
    <p>{{ message }}</p>
    <input type="button" @click="change" value="更新数据" />
    <input type="button" @click="destroy" value="销毁" />
</div>
​
<script type="text/javascript">
    var vm = new Vue({
        el: '#app',
        data: {
            message : "Welcome Vue"
        },
        methods:{
            change() {
                this.message = 'Datura is me';
            },
            destroy() {
                
                vm.$destroy();
            }
        },
        beforeCreate: function () {
            console.group('beforeCreate 创建前状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el); //undefined
            console.log("%c%s", "color:red","data   : " + this.$data); //undefined
            console.log("%c%s", "color:red","message: " + this.message);//undefined
        },
        created: function () {
            console.group('created 创建完毕状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el); //undefined
            console.log("%c%s", "color:green","data   : " + this.$data); //[object Object]  =>  已被初始化
            console.log("%c%s", "color:green","message: " + this.message); //Welcome Vue  =>  已被初始化
        },
        beforeMount: function () {
            console.group('beforeMount 挂载前状态===============》');
            console.log("%c%s", "color:green","el     : " + (this.$el)); //已被初始化
            console.log(this.$el); // 当前挂在的元素
            console.log("%c%s", "color:green","data   : " + this.$data); //已被初始化
            console.log("%c%s", "color:green","message: " + this.message); //已被初始化
        },
        mounted: function () {
            console.group('mounted 挂载结束状态===============》');
            console.log("%c%s", "color:green","el     : " + this.$el); //已被初始化
            console.log(this.$el);
            console.log("%c%s", "color:green","data   : " + this.$data); //已被初始化
            console.log("%c%s", "color:green","message: " + this.message); //已被初始化
        },
        beforeUpdate: function () {
            alert("更新前状态");
            console.group('beforeUpdate 更新前状态===============》'); //这里指的是页面渲染新数据之前
            console.log("%c%s", "color:green","el     : " + this.$el);
            console.log(this.$el);
            console.log("%c%s", "color:green","data   : " + this.$data);
            console.log("%c%s", "color:green","message: " + this.message);
            alert("更新前状态2");
        },
        updated: function () {
            console.group('updated 更新完成状态===============》');
            console.log("%c%s", "color:green","el     : " + this.$el);
            console.log(this.$el);
            console.log("%c%s", "color:green","data   : " + this.$data);
            console.log("%c%s", "color:green","message: " + this.message);
        },
        beforeDestroy: function () {
            console.group('beforeDestroy 销毁前状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);
            console.log("%c%s", "color:red","data   : " + this.$data);
            console.log("%c%s", "color:red","message: " + this.message);
        },
        destroyed: function () {
            console.group('destroyed 销毁完成状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);
            console.log("%c%s", "color:red","data   : " + this.$data);
            console.log("%c%s", "color:red","message: " + this.message)
        }
    })
</script>
</body>
</html>

6.1推荐一个浏览器监测vue插件 谷歌版 !

安装步骤

1.准备好插件 下载

文件 密码:3knf

2.下载好后我们打开谷歌浏览器 打开设置

3.打开扩展程序

4.开启开发者模式

5.开启后把下载好的 插件直接拖入浏览器的扩展程序界面即可 安装好效果

6.使用方式 我们利用一个 编写好的vue框架 编写的网页测试 打开f12 开发工具可以看见多了一个vue

7.我们可以通过工具 去动态改变值测试

7. 模板语法

Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析。vue将模板编译成虚拟dom, 结合响应系统,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少。

html模板语法: 这是一种基于字符串的模板技术,以字符串和数据为输入,通过用正则表达式将占位符替换为所需数据的方式,构建出完整的 HTML 字符串

1.1 插值

1.1.1 文本

使用{{msg}}的形式,标签将会被替换成为数据对象(data)上msg属性值,当绑定的数据对象上的msg属性值发生变化时,插值处的值也会发生变化(双向绑定) 示例:上节课的hello vue示例使用的就是插值。

1.1.2 html

{{}}的方式将数据处理为普通文本,如果要输出html,需要使用v-html指令 示例: 在data中定义一个html属性,其值为html

data: {
    html:  '<input type="text" value="hello"/>'
}

在html中取值

<span v-html="html"></span>

1.1.3 属性

HTML属性中的值应使用v-bind指令。类型与jQuery中的$("#xxx").attr(propName, propVal) 示例,以修改元素的class属性为例: 定义一个样式

<style>
.redClass {
    font-size: 30px;
    color: red;
}
</style>

在data中定义一个属性,其值为上面定义的样式名

data: {
    red: 'redClass'
}

在html使用v-bind指令设置样式

在html使用v-bind指令设置样式

<p>设置之前:  holl word</p>
<p>设置之后: <span v-bind:class="red"> holl word</span></p>

在浏览器中可以看到相应的效果

1.1.4 表达式

几种常见的表达式:

  • {{str.substr(0,6).toUpperCase()}}

  • {{ number + 1 }}

  • {{ ok ? 'YES' : 'NO' }} 三元运算符

  • <li v-bind:>我的Id是js动态生成的</li>

示例1: 在html中加入元素,定义表达式

<span>{{str.substr(0,6).toUpperCase()}}</span>

在data中加入一个属性,名为str与html中对应

data: {
    str: 'hello vue'
}

查看效果:字符串被截取,并转换为大写

示例2:

<span>{{ number + 1 }}</span>

在data中加入一个属性,名为str与html中对应

data: {
    number: 10
}

在data中定义的number值将会被加1

示例3: 这是一个三元运算,如果ok为true,表达式值为YES ,如果ok为false则表达式值为NO

<span>{{ ok ? 'YES' : 'NO' }}</span>

在data中加入一个属性,名为str与html中对应

data: {
    ok: true
}

示例4: 演示id属性绑定和动态赋值

<p>
    <input type="text" v-bind:id="bookId"/></br>
    <!--动态生成Id-->
    <input type="text" v-bind:id="'bookList_' + id"/>
</p>
data: {
    bookId: 'book001',
    id: 'book002'
}

该示例可以通过开发者工具查看生成的id属性值。

1.2 指令

指令指的是带有“v-"前缀的特殊属性

1.2.1 核心指令

1.2.1.1 v-if |v-else-if|v-else

根据其后表达式的bool值进行判断是否渲染该元素, 指令特性的值预期是单个 JavaScript 表达式 (v-for 是例外情况,稍后我们再讨论) 示例: HTML

<div v-if="type === 'A'">
    type == A
</div>
<div v-else-if="type === 'B'">
    type == B
</div>
<div v-else>
    other value
</div>

JS

  var vm = new Vue({

        el: '#app',

        data: {
            type: 'C'
        }
    });

可以修改data中的type值观察页面的输出。

注: js = == === 之间的区别 一个等号是赋值操作,==先转换类型再比较,===先判断类型,如果不是同一类型直接为false alert(1 == “1”); // true alert(1 === “1”); // false

1.2.1.2 v-show

与v-if类似,只是不会渲染其身后表达式为false的元素,而且会给这样的元素添加css代码:style="display:none"。 当v-show 表达式true则显示,否则不显示。 注意:使用v-show,虽然不显示,但在页面的dom中是存在的,只是display属性为none 示例: 在HTML中加入如下内容

<div v-show="show === 'yes'">
    show == yes
</div>

在data中定义show属性

var vm = new Vue({
    el: '#app',
    data: {
        show: 'yes' 
    }
});

修改show值,观察页面显示

1.2.1.3 v-for

循环遍历

  • 遍历数组: v-for="item in items", items是数组,item为数组中的数组元素

  • 遍历对象: v-for="(value,key,index) in stu", value属性值, key属性名,index下标 示例: 定义一个div,使用v-for指令输出,items是vue实例中data中定义的对象数组

<!--数组-->
<div v-for="item in items">
     {{item.name}} -- {{item.id}}
</div>

<!--循环生成下拉列表-->
<div>
    <select >
        <option v-for="item in items" 
            v-bind:value="item.id">{{item.name}}</option>
    </select>
</div>

<!--对象-->
<div v-for="(o,key) in obj">
    {{key}}-{{o}}
</div>
var vm = new Vue({

    el: '#app',

    data: {
        itmes:[
            {name: 'zs',age:18},
            {name: 'ww',age:19},
            {name: 'ls',age:20},
            {name: 'zl',age:21}
        ],
        obj: {
            name:'张三',
            age: 21,
            addr: '湖南长沙'
        }
    }
});

1.2.1.4 v-on|v-model|v-for

创建一组多选框,可以获取到用户选择项

<!--
循环生成一组多选按钮,v-model通过vue的双向绑定将用户选择的项保存到
定义的selected组数中
-->
<div v-for="(item,index) in items">
    //监测 动态 v-model="selected"
    {{index}}:<input type="checkbox" v-bind:value="item.id"
            v-model="selected"
                     >{{item.name}}
</div>
<button v-on:click="getSelected()">获取选择</button>
var vm = new Vue({

    el: '#app',

    data: {
        type: 'C',
        show: 'no',
        items:[
            {name: '长沙',id:18},
            {name: '昆明',id:19},
            {name: '武汉',id:20},
            {name: '南京',id:21}
        ],
        obj: {
            name:'张三',
            age: 21,
            addr: '湖南长沙'
        },
        selected:[]
    },
    methods: {
        getSelected: function() {
            console.log(this.selected);
        }
    }
});

效果演示

1.2.1.5 参数 v-bind:href,v-on:click

示例:

<!--参数:href-->
<div>
    <a v-bind:href="url">baidu</a>
</div>

<!--
参数:动态参数.
attname需要在data中定义,
注意:attname要全部小写!!
-->
<div>
    <a v-bind:[attrname]="url">baidu</a>
    <button v-on:[evname]="clickme">点我看看</button>
</div>

注意:在动态参数中,作为参数的变量名(如:attrname)要全部小写,否则无效 !!

var vm = new Vue({

    el: '#app',

    data: {

        url: 'https://www.baidu.com',
        attrname:'href',
        evname: 'click'
    },

    methods: {
        clickme: function() {
            console.log("点到我了");
        }
    }

});

1.2.1.6 简写

Vue为v-bind和v-on这两个最常用的指令,提供了特定简写

指令简写示例
v-bind:xxx:xxxv-bind:href 简写为 :href
v-on:xxx@xxxv-on:click 简写为 @click

2. 过滤器

vue允许自定义过滤器,一般用于常见的文本格式化,过滤器可用的两个地方:双花括号插值v-bind表达式,过滤器应该被添加在js表达式的尾部,使用管道运算符"|"

2.1 局部过滤器

局部过滤器的定义:

var vm = new Vue({
    filters: {
        'filterName': function(value) {
            //过滤器实现
        }
    }
});

过滤器的使用

<!--双花括号中的使用-->
{{ name | capitalize }}

<!--在 v-bind 指令中的使用-->
<div v-bind:id="rawId | formatId"></div>
  • 注1:过滤器函数接受表达式的值作为第一个参数

  • 注2:过滤器可以串联 {{ message | filterA | filterB }}

  • 注3:过滤器是JavaScript函数,因此可以接受参数: {{ message | filterA('arg1', arg2) }}

示例:

<div>
    <p>{{msg | toUpperCase}}</p>
</div>
var vm = new Vue({

    el: '#app',

    data: {
        msg:"hello vue"
    },

    //局部过滤器
    filters:{
        toUpperCase: function(value) {
            return value.toUpperCase();
        }
    }

});

2.2 全局过滤器

拷入date.js(日期格式化)放入项目js目录中,在页面中引入。 定义全局过滤器  

//全局过滤器
Vue.filter('fmtDate',function(value) {
    return fmtDate(value, 'yyyy年MM月dd日')
});

过滤器的使用

<div>
    <p>{{date | fmtDate}}</p>
</div>

装换日期工具类

//给Date类添加了一个新的实例方法format
Date.prototype.format = function (fmt) {
	//debugger;
    var o = {
        "M+": this.getMonth() + 1,                 //月份
        "d+": this.getDate(),                    //日
        "h+": this.getHours(),                   //小时
        "m+": this.getMinutes(),                 //分
        "s+": this.getSeconds(),                 //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds()             //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
};

function fmtDate(date, pattern) {
	var ts = date.getTime();
    var d = new Date(ts).format("yyyy-MM-dd hh:mm:ss");
    if (pattern) {
        d = new Date(ts).format(pattern);
    }
    return d.toLocaleString();
};

3. 计算属性

计算属性用于快速计算视图(View)中显示的属性,这些计算将被缓存,并且只在需要时更新 使用场景:当一个属性需要复杂的逻辑运算之后才能获取其值,可以使用计算属性,在一个计算属性中可以完成各种复杂的逻辑,包括运算,方法调用等,只要最终返回一个结果就可以了 声明计算属性的格式:

computed:{
   xxx:function(){

   }
}

示例: 使用计算属性,计算书本的总价 定义测试数据,和计算属性,计算属性遍历书本记录,计算总价

var vm = new Vue({

    el: '#app',

    data: {
        //定义测试数据
        books: [
            {name:'红楼梦', price:"120"},
            {name:'三国演义', price:"100"},
            {name:'水浒传', price:"90"},
        ]
    },

    //计算属性
    computed: {
        compTotal: function() {
            let sum = 0;
            for(index in this.books) {
                sum += parseInt(this.books[index].price);
            }
            return sum;
        }
    }

});

计算属性在页面中的使用

<div v-for="book in books">
    {{book.name}} -> {{book.price}}
</div>

<div>
    总价:{{compTotal}}
</div>

关于varlet

  • var声明为全局属性

  • let为ES6新增,可以声明块级作用域的变量(局部变量)

  • 建议使用let声明变量

4.监听属性

使用场景:我们可以使用监听属性watch来响应数据的变量, 当需要在数据变化时执行异步或开销较大的操作时,这种方式比较有用。回想一下是否做过下拉列表的级联选择?

watch声明语法:

watch: {
    xxxx: function(val) {
        //监听器实现
    }
}

示例: 米和厘米的单位换算 设置监听器:

var vm = new Vue({

    el: '#app',

    data: {
        m: 1,
        cm: 100
    },

    //设置监听属性 属性变化
    watch: {
        m: function(val) {
            if(val)
                this.cm = parseInt(val) * 100;
            else
                this.cm = "";
        },
        cm: function(val) {
            if(val)
                this.m = parseInt(val) / 100;
            else
                this.m = "";
        }
    }

});

HTML中使用v-model实现与数据的双向绑定

<div>

    <!--注意v-model的双向绑定-->

    米:     <input type="text" v-model="m">

    厘米:  <input type="text" v-model="cm">

</div>

演示代码 

日期装好  js 下载

date.txt - 蓝奏云 下载好后 后缀 改为js即可

基本 文本用法 -过滤器

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!-- <script src="https://unpkg.com/vue@next"></script> -->
		<script src="js/v2.6.10/vue.js" type="text/javascript" charset="utf-8"></script>
	    <script src="js/date.js" type="text/javascript" charset="UTF-8"></script>
	</head>
	<body>
		<div id="app">
			{{ counter }}
			<input type="text"  v-model="msg"/>
			<button @click="onsbumt" >点击</button>
			
			<a v-bind:href="url">百度</a>
			{{str.substr(0,6).toUpperCase()}}
			{{number + 1}}
			{{ok ? "yes" : "no"}}
			<li v-bind:id="'list-' + id">动态id生成</li>
			<br />
			{{ str | filterA }}
			<div>
				{{date | dateFormat}}
			</div>
		</div>
		
		<script>
		//全局过滤器
		Vue.filter('dateFormat',function(data){
		return fmtDate(data,"yyyy年MM月dd日 hh时mm分ss秒")
		})
		
			var vm=new Vue(
			{
				el:"#app",
				data:{
					counter:"你好呀",
					msg:"ddd",
					url:"www.baidu.com",
					str:"hello world",
					number: 90,
					ok: true,
					id:"ood",
					date:new Date()
					
				},
				//交互事件
				methods:{
					onsbumt(){
						alert("1")
					}
				},
				//生命周期钩子
				created:function(){
					console.log("e")
				},
				//局部过滤器
				filters:{
					'filterA':function(str){
						return str.substr(0,1).toLocaleUpperCase() + str.substr(1); 
					}
				}
				
			}
			
			)
		</script>
	</body>
</html>

监听 - 计算函数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
		 .redClass {
		     font-size: 30px;
		     color: red;
		 }
		</style>
	</head>
	<script src="js/v2.6.10/vue.js" type="text/javascript" charset="utf-8"></script>
	<body>
		
		
		
		<div id="app">
			
			<p :class="red">
				holl word
			</p>
			
			
			
			
			<span v-html="html"></span>

			<p>
			<div v-if="type == 'c'">
				c
			</div>
			<div v-else-if="type == 'b'">
				b
			</div>
			<div v-else>
				无
			</div>

			</p>
			<!--数组-->
			<div v-for="item in items">
				{{item.name}} -- {{item.age}}
			</div>

			<!--循环生成下拉列表-->
			<div>
				<select>
					<option v-for="item in items" v-bind:value="item.age">{{item.name}}</option>
				</select>
			</div>

			<!--对象-->
			<div v-for="(o,key) in obj">
				{{key}}-{{o}}
			</div>

			<!--
			循环生成一组多选按钮,v-model通过vue的双向绑定将用户选择的项保存到
			定义的selected组数中
			-->
			<div v-for="(item,index) in items">
				{{index}}:<input type="checkbox" v-bind:value="item.age" v-model="selected">{{item.name}}
			</div>
			<button @click="getSelected()">获取选择</button>
			<br />
			book = {{compTotal}}
			<p>
			<div>
				<!--注意v-model的双向绑定-->
				米: <input type="text" v-model="m">
				厘米: <input type="text" v-model="cm">
			</div>
			</p>

		</div>


		<script>
			var vm = new Vue({
				el: "#app",
				data: {
					html: '<input type="text" value="hello"/>',
					type: "b",
					items: [{
							name: 'zs',
							age: 18
						},
						{
							name: 'ww',
							age: 19
						},
						{
							name: 'ls',
							age: 20
						},
						{
							name: 'zl',
							age: 21
						}
					],
					obj: {
						name: '张三',
						age: 21,
						addr: '湖南长沙'
					},
					selected: [],
					books: [{
							name: '红楼梦',
							price: "120"
						},
						{
							name: '三国演义',
							price: "100"
						},
						{
							name: '水浒传',
							price: "90"
						},
					],
					m: 1,
					cm: 100,
					red:"redClass"

				},
				methods: {
					getSelected() {
						console.log(this.selected)
					}
				},
				//计算属性
				computed: {
					compTotal: function() {
						let sum = 0;
						for (index in this.books) {
							sum += parseInt(this.books[index].price);
						}
						return sum;
					}
				},
				watch: {
					m: function(val) {
						if (val)
							this.cm = val * 100;
						else
							this.cm = "";
					},
					cm: function(val) {
						if (val)
							this.m = val / 100;
						else
							this.m = "";
					}
				}
			})
		</script>

	</body>
</html>

Logo

前往低代码交流专区

更多推荐