Vue复习-------(1)

658 阅读2分钟

由于跨专业学的前端,所以一直没有什么项目做(貌似只写了几个demo),前段时间学的vue都快要忘了。。。。。。所以为了复习方便,写了这几篇文章,前面这几篇就是把vue官网敲了一遍,一是复习一下二是方便我随时随地看,往后几篇则是源码分析

挂载

<div id="app">        
    {{ message }}    
</div>

var app = new Vue({            
    el: '#app',            
    data: {                
        message: 'Hello Vue!'            
    }        
})

<div id="app-2">        
    <span v-bind:title="message">            
        鼠标悬停与此        
    </span>    
</div>

new Vue({            
    el: "#app-2",            
    data: {                
        message: new Date().toLocaleString()            
    }        
})
<div id="app-3">
  <p v-if="seen">现在你看到我了</p>
</div>
var app3 = new Vue({
  el: '#app-3',
  data: {
    seen: true
  }
})
app.seen = false;
<div id="app-4">
  <ol>
    <li v-for="todo in todos">
      {{ todo.text }}
    </li>
  </ol>
</div>
var app4 = new Vue({
  el: '#app-4',
  data: {
    todos: [
      { text: '学习 JavaScript' },
      { text: '学习 Vue' },
      { text: '整个牛项目' }
    ]
  }
})
<div id="app-5">
  <p>{{ message }}</p>
  <button v-on:click="reverseMessage">逆转消息</button>
</div>
var app5 = new Vue({
  el: '#app-5',
  data: {
    message: 'Hello Vue.js!'
  },
  methods: {
    reverseMessage: function () {
      this.message = this.message.split('').reverse().join('')
    }
  }
})
<div id="app-6">
  <p>{{ message }}</p>
  <input v-model="message">
</div>
var app6 = new Vue({
  el: '#app-6',
  data: {
    message: 'Hello Vue!'
  }
})

v-model实际上是一个语法糖,实际上实现方法如下

<input type="text" v-bind:value="inputValue" v-on:input="inputValue = $event.target.value" >

组件

<div id="app-7">
  <ol>
    <todo-item
      v-for="item in groceryList"
      v-bind:todo="item"
      v-bind:key="item.id">
    </todo-item>
  </ol>
</div>
Vue.component('todo-item', {
  props: ['todo'],
  template: '<li>{{ todo.text }}</li>'
})

var app7 = new Vue({
  el: '#app-7',
  data: {
    groceryList: [
      { id: 0, text: '蔬菜' },
      { id: 1, text: '奶酪' },
      { id: 2, text: '随便其他什么人吃的东西' }
    ]
  }
})

数据与方法

vue实例被创建以后新添加的data数据不是响应式的

var obj = {
  foo: 'bar'
}

Object.freeze(obj)//冻结obj,防止响应系统追踪变化

new Vue({
  el: '#app',
  data () {
    return {
      obj
    }
  }
})

vue暴露到外部的几个接口,以$为前缀,防止与用户定义的混淆

var data = { a: 1 }
var vm = new Vue({
  el: '#example',
  data: data
})
vm.$data === data // => true
vm.$el === document.getElementById('example') // => true
vm.$watch('a', function (newValue, oldValue) {
  // 这个回调将在 `vm.a` 改变后调用
})

实例生命周期

created:实例被创建后执行内部代码,还有mounted,updated,destroyed

new Vue({
  data: {
    a: 1
  },
  created: function () {
    console.log('a is: ' + this.a)
  }
})

官网上生命周期的图大概就是:先new一个Vue实例,触发beforeCreate和created,判断是否有el挂载DOM,有就查看template模板(有就用模板替换html,没有就用原生html),没有就等待vm.$mount()被调用。然后在beforeMount生命周期钩子触发完毕后,将vm.$el替换用户自己定义的el,然后触发mounted钩子。然后检查data是否有更新,有就触发beforeUpdata,以及updated。最后在vm.$destroy()调用时,先触发beforeDestroy钩子,然后销毁vue实例(卸载watch,组件,事件监听等),最后调用destroy钩子,销毁完毕。

模板语法

文本

<span>Message: {{ msg }}</span>
<span v-once>这个将不会改变: {{ msg }}</span>

html(动态渲染html很危险,少用,小心xss攻击)

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

使用v-bind修改html

<div v-bind:id="dynamicId"></div>

使用js表达式(注意,只能包含单个语句)

{{ number + 1 }}

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

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

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

参数

响应式更新属性

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

响应式监听DOM

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

修饰符

修饰符 (Modifiers) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()

<form v-on:submit.prevent="onSubmit">...</form>