Vue学习(4)---模板语法、指令、计算属性、侦听器

模板语法

Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析

在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少。
文本输出利用Mustache语法({{}}取值)
{{msg}} 将会被代替为数据对象data中msg属性的值(并且是插值处的内容会随着msg改变而改变)

如果你熟悉虚拟 DOM 并且偏爱 JavaScript 的原始力量,你也可以不用模板,直接写渲染 (render) 函数,使用可选的 JSX 语法。

指令

指令 (Directives) 是带有 v- 前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式 (v-for 是例外情况,稍后我们再讨论)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM

举一些例子
html输出则使用v-html
属性绑定则使用v-bind

  • 参数

一些指令能够接收一个“参数”,在指令名称之后以冒号表示。例如,v-bind 指令可以用于响应式地更新 HTML attribute:
比如 v-bind 可以绑定一些原有的属性 style href class 进而来动态的更新属性
v-on 可以绑定原生事件 点击 聚焦之类的操作
指令可以接收参数 v-bind: v-on: 都可以带一个参数
甚至可以携带一个动态参数 v-bind:[value]="xxxx"

实际上,对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持

我们可以在{{}}中书写js表达式 当然v-bind:id="'value'+id" 这样也可以

这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,而不能包含语句和流控制

  • 修饰符

修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()
preventDefault是取消浏览器对当前事件的默认行为
有什么用?
比如 如果我们自己定义了组件 使用这个组件的时候 如果想要绑定浏览器的原生事件 (自定义组件绑定事件默认不是原生事件)
就可以使用修饰符解决这个问题

<comp v-on:click="handleClick"></comp>  //自定义组件,这么写无效 无法绑定原生事件
<comp v-on:click.native="handleClick"></comp>  //绑定了原生事件
  • 缩写

有些使用频繁的指令 为他们提供了简写
v-bind缩写: v-on缩写@

计算属性

虽然我们可以在模板内部使用表达式来计算值 {{}}

<div>
{{"这是测试"+message}}  
</div>

但是,这样其实加重了视图层的逻辑 为了减少复杂逻辑 应当使用计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护
所以,对于任何复杂逻辑,你都应当使用计算属性。

<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
})

计算属性依赖于对应需要的普通属性,因此当普通属性改变时,计算属性重新计算,重新渲染到页面上
在计算属性中可以设置get,set函数
get函数类似于原来计算属性的定义 也要返回一个计算的值
而set函数可以帮我们更新普通属性

	<div id="app">
		{{fullName}}
            <p>{{firstName}}</p>
	    <p>{{lastName}}</p>
	</div>
var vm=new Vue({
        el:'#app',
	data:{
	    firstName:"57",
	    lastName:"one",
        },
	computed:{
	    fullName:{
		get:function() {
		    return this.firstName+" "+this.lastName;
		},
		set:function(value){
		    console.log("change");
		    var arr=value.split(" ");
		    this.firstName=arr[0];
		    this.lastName=arr[1];
		}
	    }
        }
})

我们可以在控制台中改变计算属性fullName的值
同时也会改变 普通属性firstName与lastName的值(也就是改变值时候 调用了计算属性的set方法)

计算属性缓存vs方法

方法也可以达到这这样的效果,我们可以在{{}}调用函数来进行同样的效果显示
但是不同的使 方法在重新渲染时候 总会再一次执行该函数
而计算属性使依赖于对应的普通属性,如果这些普通属性没有发生变化,那么不会重新执行函数(计算属性对应的函数)

计算属性vs侦听器

虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的
正如侦听器字面意思 可以监听数据的变化

	<script>
	var vm=new Vue({
		el:'#app',
		data:{
			firstName:"Dell",
			lastName:"Lee",
			fullName:"Dell Lee",
			age:28,
		},

		//利用侦听器  
		//内置缓存
		watch:{
			firstName:function() {
				console.log("计算了一次");
				this.fullName=this.firstName+" "+this.lastName;
			},
			lastName:function(){
				console.log("计算了一次");
				this.fullName=this.firstName+" "+this.lastName;
			}
		}
posted @ 2020-04-22 23:01  57one  阅读(169)  评论(0编辑  收藏  举报