美文网首页
Vue 学习

Vue 学习

作者: BGING | 来源:发表于2018-07-17 17:17 被阅读0次

vue 学习记录。

参考网址

建议

  • 建议还是用 npm 安装,开始用 cnpm 安装的时候失败

理解 Vue

数据相关的属性

  • 所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象 (一些根实例特有的选项除外)。

    var vm = new Vue({
      // 选项
    })
    
  • 当数据更改的时候,vue视图才会渲染。只有当实例被创建时 data 中存在的属性才是响应式的 ,也就是说如果在创建 vue 实例的时候没有绑定 data 属性,那么后期添加的属性是不会动态追踪,视图也不会对应更改。

    • 定义为空的初始值
    • Object.freeze() : 会阻止现有现有的属性更改,响应系统不会追踪变化

Vue 实例还暴露了一些有用的实例属性与方法。 它们都有前缀 $,以便与用户定义的属性区分开来。 这属性是 Vue自己已经定义好了的。

var data = { a: 1 }
var vm = new Vue({
  el: '#example',
  data: data
})

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

生命钩子介绍

不要在选项属性或回调上使用箭头函数, 这样会抛出 this 引用作用域的一些错误。这

created  mounted、updated 和 destroyed

new Vue({
  data: {
    a: 1
  },
  created: function () {
    // `this` 指向 vm 实例
    console.log('a is: ' + this.a)
  }
})
// => "a is: 1"

模板语法

  • v-once: 一次性插入数据,并且是不会更新。

  • v-html:会将 字符串 HTML 转换成真正的HTML。

  • 插值语法{{}} 支持全部的 js 表达式,比 angular 支持的好很多。

    • 每个绑定只能包含单个的表达式。
    • 不应该在模板表达式中试图访问用户定义的全局变量。
    <!-- 每个绑定都只能包含单个表达式 -->
    
    <!-- 这是语句,不是表达式 -->
    {{ var a = 1 }}
    
    <!-- 流控制也不会生效,请使用三元表达式 -->
    {{ if (ok) { return message } }}
    

指令

v- 前缀的特殊特性,指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

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

    <a v-bind:href="url">...</a>
    <!--在这里 href 是参数,告知 v-bind 指令将该元素的 href 特性与表达式 url 的值绑定。--> 
    
    // 做事件监听
    <a v-on:click="doSomething">...</a>
    
    // v-bind 可以把值绑定到动态属性上,并且属性的值可以不是字符串。
    
  • 修饰符:修饰符 (Modifiers) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。

    
    // 在点击提交之前执行
    <form v-on:submit.prevent="onSubmit">...</form>
    

缩写

对 v-bind / v-on 常用的 2 个指令做了缩写

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

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

v-bind 更改元素本身属性的值。


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

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

class & style 绑定

  • 对象语法

    <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
    data: {
      activeColor: 'red',
      fontSize: 30
    }
    
  • 数组语法

    <div v-bind:style="[baseStyles, overridingStyles]"></div>
    
  • 对于 css 属性 Vue 会自动的添加一些属性 如 transform

  • 多重值: 会根据浏览器不同自动选择

    <div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
    

Vue 实力对象属性

  • computed:计算属性返回一个计算好的值。
1. getter 属性
2. setter 属性


<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('')
    }
  }
})

1. 计算属性的值,是依赖 message 的值。
2. 如果 message 的值不更改那么计算属性的值也不会变化。

  • methods: 方法

    1.methods & computed 都可以实现相同的功能
    2.相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。而 computed 计算的值是有依赖关系
    
  • 侦听属性: 也是对 data 属性的值做一部分更改

     1.watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该。但是计算属性是没有办法做到这一步的。   
     2.vm.$watch API。 可以参考
    

条件渲染

  • v-if 、v-else、v-else-if , 这些指令可以配合 template 元素

    • 如果元素不是经常切换
    1.在 <template> 中可以操作多个模块显示和删除
    <template v-if="ok">
      <h1>Title</h1>
      <p>Paragraph 1</p>
      <p>Paragraph 2</p>
    </template>
    
    2.v-else 必须跟在 v-if后面不然是不会识别
    <div v-if="Math.random() > 0.5">
      Now you see me
    </div>
    <div v-else>
      Now you don't
    </div>
    3.v-else-if 也必须跟在 v-if | v-else-if 后面
    
    
  • v-show:仅仅操作 css 的 display 的属性值。

    • 如果元素经常切换,用 v-show
    • v-show 不支持 <template> 元素,也不支持 v-else。 这个和 if else 就有很大的区别。
  • v-for

    // 可以在 v-for 方法里嵌套方法
    <li v-for="n in even(numbers)">{{ n }}</li>
    
    • 可以使用 <template></template> 渲染多个元素

    • v-if 和 v-for 可以处在同一个元素上,这在 Angular 上是不允许的。

      // 但是 v-for 优先级高于 v-if, v-if 会在 v-for 的遍历中执行。
      
      <li v-for="todo in todos" v-if="!todo.isComplete">
        {{ todo }}
      </li>
      

数组更新检测

数组更新也可以检测? 懵逼了真的,起了个名字 ”变异的数组“。

  • 数组方法不会触发跟踪属性的方法, filter(), concat(),slice()。 其它的数组方法都是会触发。

    // 注意: 
    1.当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
    2.当你修改数组的长度时,例如:vm.items.length = newLength
    只能用
    Vue.set(v.item, indexOfItem, newValue);
    // Array.prototype.splice
    vm.items.splice(indexOfItem, 1, newValue);
    
    也可以用 vm.$set
    

    vm.$set 实力方法 是 全局Vue.set 的别名

对象检车注意事项

  • 还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除

  • 可以用 vm.$set 或 Vue.set 方法给已经实例化的对象添加属性

  • Object.assign

    vm.userProfile = Object.assign({}, vm.userProfile, {
      age: 27,
      favoriteColor: 'Vue Green'
    })
    

了解组件 ?

现在理解有点模糊,需要在整理。

  • 通过 prop 父组件向子组件传递值
  • 子组件 - > 父组件传递值 ,子组件 $emit 触发一个事件,然后父组件监听对应的值。

事件

事件的运用,参数的传递

  • 事件可以直接执行 js 表达式,也可以传递参数
  • 事件里存在的修饰符也可以对事件执行造成影响 .once执行一次...
  • 使用修饰符的时候,可以使用多个。但是顺序的搭配不同,对事件的影响也会不同。
  • .passive 和 .prevent 不要同时使用,prevent 会被忽略

数据绑定

  • 单项数据绑定 v-model 但是会忽略初始值。基本表单元素都是可以获取值
    • 可以实现多个 checkbox 的值绑定到同一个数组
    • select 元素推荐一个 空的 option 值

自定义组件

组件是可复用的 Vue 实例


// 定义一个名为 button-counter 的新组件
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})


<div id="components-demo">
  <button-counter></button-counter>
</div>

//js
new Vue({ el: '#components-demo' })

自定义事件

相关文章

网友评论

      本文标题:Vue 学习

      本文链接:https://www.haomeiwen.com/subject/desgpftx.html