vue重新起航(二)

创建实例:

var vm = new Vue({

})

    var data = { a : 1}
    var vm = new Vue({
      data:data
    })

    console.log(vm.a == data.a)

    vm.a = 2
    console.log(data.a) //2
    反之相同

vue中数据是响应式的,一旦数据改变,视图将会产生相应的变化
只有当实例被创建时 data 中存在的属性才是响应式的,添加一个新的属性改动将不会触发任何视图的更新

注意 Object.freeze(obj) 可以阻止修改现有属性


vue实例有很多属性和方法
var data = { a: 1 }
var vm = new Vue({
el: '#example',
data: data
})

vm.$data === data // => true
vm.$el === document.getElementById('example') // => true 挂载

// $watch 是一个实例方法 监听
vm.$watch('a', function (newValue, oldValue) {
// 这个回调将在 vm.a 改变后调用
})


生命周期钩子
四对:beforeCreate、created、
beforeMount 、mounted
beforeUpdate、 updated
beforeDestory、destoryed

生命周期.png

模板语法

插值

1.文本{{message}} v-once 一次性插值
2.原始HTML

<p>Using mustaches: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
image.png

span的内容将会被替换成属性值rawHtml
3.特性,Mustache 不能用在HTML特性上,用v-bind来绑定
4.支持js表达式

{{ number + 1 }}

{{ ok ? 'YES' : 'NO' }}

{{ message.split('').reverse().join('') }}

<div v-bind:id="'list-' + id"></div>

只能包含单个表达式,下面两种不会生效

<!-- 这是语句,不是表达式 -->
{{ var a = 1 }}

<!-- 流控制也不会生效,请使用三元表达式 -->
{{ if (ok) { return message } }}

指令 v-

参数

一些指令能够接收一个“参数”,在指令名称之后以冒号表示。

<a v-bind:href="url">...</a>
<a v-on:click="doSomething">...</a>

缩写

v-bind :

<!-- 完整语法 -->
<a v-bind:href="url">...</a>

<!-- 缩写 -->
<a :href="url">...</a>

v-on @

<!-- 完整语法 -->
<a v-on:click="doSomething">...</a>

<!-- 缩写 -->
<a @click="doSomething">...</a>

计算属性 computed

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护

模板内表达式获取翻转字符串
<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

如果需要多次使用到这个翻转字符串,就会显得很麻烦
所以计算属性computed 应运而生

<div id="example">
    <p>Original message: "{{ message }}"</p>
    <p>Computed reversed message: "{{ reversedMessage }}"</p>
  </div>

  <script>
    var vm = new Vue({
      el:'#example',
      data:{
        message:'hello'
      },
      computed:{
        //计算属性的getter,返回相应的值
        reversedMessage: function(){
          return this.message.split('').reverse().join('')
        }
      }
    })

同样的效果也可以通过在methods里面设置一个函数来实现

<p>Reversed message: "{{ reversedMessage() }}"</p>
// 在组件中
methods: {
  reversedMessage: function () {
    return this.message.split('').reverse().join('')
  }
}

效果完全相同,但是又有什么不一样的地方呢??

计算属性是基于他们的依赖进行缓存的,只有当依赖改变时他们才会重新求值,只要message不改变,多次访问reverseMessage会立即返回之前计算结果。而每当触发重新渲染时,调用方法将总会再执行函数


计算属性 computed和侦听属性watch

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性

与其滥用侦听属性,不如好好利用计算属性

<div id="demo">{{fullName}}</div>

var vm1 = new Vue({
      el: '#demo',
      data: {
        firstName: 'Foo',
        lastName: 'Bar',
        fullName: 'Foo Bar'
      },
      watch: {
        firstName: function (val) {
          this.fullName = val + ' ' + this.lastName
        },
        lastName: function (val) {
          this.fullName = this.firstName + ' ' + val
        }
      }

这里就运用了侦听器属性watch来侦听firstName和lastName,这两个如果有变化立刻处理重新渲染页面,但是我们发现,监听的函数很相似,若是有多个变量,那么侦听器将会显得十分冗杂,看看运用computed效果如何?

  <div id="demo">{{fullName1}}</div>

   computed:{
        fullName1: function(){
          return this.firstName + '' + this.lastName
        }
      }
image.png

效果很不错,因此尽量用computed属性

添加set

 var vm1 = new Vue({
      el: '#demo',
      data: {
        firstName: 'Foo',
        lastName: 'Bar',
        fullName: 'Foo Bar'
      },
      computed: {
        fullName1: {
          get: function () {
            return this.firstName + ' ' + this.lastName
          },
          set: function (newValue) {
            console.log('我被调用了')
            var names = newValue.split(' ')
            this.firstName = names[0]
            this.lastName = names[names.length - 1]
          }
        }
      }

这个时候修改fullname firstname, lastname 也会相应更新

image.png

侦听器 watch 当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,044评论 0 29
  • # 传智播客vue 学习## 1. 什么是 Vue.js* Vue 开发手机 APP 需要借助于 Weex* Vu...
    再见天才阅读 3,525评论 0 6
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 10,986评论 4 129
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 3,324评论 0 25
  • 贤臣佐王政,行法内安官。 一纸将杀令,全因莫须门。 【2016,1,19。三古月南】 【QQ:1539142491】
    三古月南阅读 215评论 0 1