官方文档比较乱。写的时候稍微整理了整理,但是内容不全。
Vue 基础
参考资料 Vue官方文档
runoob
基础
最简单的方法是直接引用就行,
| 12
 3
 4
 5
 6
 7
 8
 
 | <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 或者:
 
 <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 <div id="app">
 {{ message }}
 </div>
 
 | 
需要注意的是js内容无法通过直接使用外部引用来完成
| 12
 3
 4
 5
 6
 
 | var app = new Vue({el: '#app',
 data: {
 message: 'Hello Vue!'
 }
 })
 
 | 
运行之后,可以在控制台里面对app.message进行修改
v-model 还可以双向绑定修改input框中的内容,p中内容也会改变
| 12
 3
 4
 
 | <div id="app-6"><p>{{ message }}</p>
 <input v-model="message">
 </div>
 
 | 
| 12
 3
 4
 5
 6
 
 | var app6 = new Vue({el: '#app-6',
 data: {
 message: 'Hello Vue!'
 }
 })
 
 | 
实例
Vue的属性与用户定义的内容是分开来的
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | var data = { a: 1 }var vm = new Vue({
 el: '#example',
 data: data
 })
 
 vm.$data === data
 vm.$el === document.getElementById('example')
 
 
 vm.$watch('a', function (newValue, oldValue) {
 
 })
 
 | 
vue实例被创建的时候带有生命周期,可以用created来执行一个实例被创建后的函数
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | new Vue({data: {
 a: 1
 },
 created: function () {
 
 console.log('a is: ' + this.a)
 }
 })
 
 
 | 
样例
常用数据绑定形式就是双大括号,但是这种只是讲文本插入,如果要使用html就需要使用v-html
| 12
 3
 
 | <span>Message: {{ msg }}</span><span v-once> vonce使得此处内容插入后不能被修改:{{msg}}</span>
 <p>Using v-html directive: <span v-html="rawHtml"></span></p>
 
 | 
模板支持单个的js表达式
在2.6版本中,可以用方括号括起来的一个js表达式作为一个指令的参数
| 12
 3
 4
 
 | <a v-bind:[attributeName]="url"> ... </a>
 <a v-on:[eventName]="doSomething"> ... </a>
 
 
 | 
v-bind和v-on都可以缩写
| 12
 3
 4
 5
 6
 7
 8
 
 | <a v-bind:href="url">...</a>
 
 <a :href="url">...</a>
 
 <a v-on:click="doSomething">...</a>
 
 <a @click="doSomething">...</a>
 
 | 
计算属性 computed
可以在vue的实例里创建computed的属性。尽量不使用箭头函数,有时候会导致this指向错误。
| 12
 3
 4
 5
 
 | <div id="example"><p>Original message: "{{ message }}"</p>
 <p>Computed reversed message: "{{ reversedMessage }}"</p>
 </div>
 
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | var vm = new Vue({el: '#example',
 data: {
 message: 'Hello'
 },
 computed: {
 
 reversedMessage: function () {
 
 return this.message.split('').reverse().join('')
 }
 }
 })
 
 | 
侦听属性 watch
有些数据会随着其他数据变化而变化,因此容易滥用watch,建议使用计算属性。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | <div id="demo">{{ fullName }}</div>
 var vm = 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
 }
 }
 })
 
 上面代码是命令式且重复的。将它与计算属性的版本进行比较:
 var vm = new Vue({
 el: '#demo',
 data: {
 firstName: 'Foo',
 lastName: 'Bar'
 },
 computed: {
 fullName: function () {
 return this.firstName + ' ' + this.lastName
 }
 }
 })
 
 | 
计算属性的setter
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | computed: {fullName: {
 
 get: function () {
 return this.firstName + ' ' + this.lastName
 },
 
 set: function (newValue) {
 var names = newValue.split(' ')
 this.firstName = names[0]
 this.lastName = names[names.length - 1]
 }
 }
 }
 
 | 
这样子就能对fullname进行修改
class与style绑定
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | <divclass="static"
 v-bind:class="{ active: isActive, 'text-danger': hasError }"
 ></div>
 
 data: {
 isActive: true,
 hasError: false
 }
 
 | 
写成计算属性
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | <div v-bind:class="classObject"></div>
 
 data: {
 isActive: true,
 error: null
 },
 computed: {
 classObject: function () {
 return {
 active: this.isActive && !this.error,
 'text-danger': this.error && this.error.type === 'fatal'
 }
 }
 }
 
 | 
也可以应用成一个数组
| 1
 | <div v-bind:class="[activeClass, errorClass]"></div>
 | 
| 12
 3
 4
 
 | data: {activeClass: 'active',
 errorClass: 'text-danger'
 }
 
 | 
用在组件上
| 12
 3
 4
 5
 
 | <my-component class="baz boo"></my-component>
 <p class="foo bar baz boo">Hi</p>
 
 <my-component v-bind:class="{ active: isActive }"></my-component>
 
 | 
这些组件需要放在vue创建的内容下
| 12
 3
 
 | Vue.component('my-component', {template: '<p class="foo bar">Hi</p>'
 })
 
 | 
用在style上
| 1
 | <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
 | 
| 12
 3
 4
 
 | data: {activeColor: 'red',
 fontSize: 30
 }
 
 | 
当然 直接绑定对象更好
| 1
 | <div v-bind:style="styleObject"></div>
 | 
| 12
 3
 4
 5
 6
 
 | data: {styleObject: {
 color: 'red',
 fontSize: '13px'
 }
 }
 
 | 
条件渲染 if
有v-if跟v-else
| 12
 
 | <h1 v-if="awesome">Vue is awesome!</h1><h1 v-else>Oh no 😢</h1>
 
 | 
v-show差不多 区别在渲染时候的不同
列表 for
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | <ul id="example-1"><li v-for="item in items">
 {{ item.message }}
 </li>
 </ul>
 
 var example1 = new Vue({
 el: '#example-1',
 data: {
 items: [
 { message: 'Foo' },
 { message: 'Bar' }
 ]
 }
 })
 
 | 
监听 on
除了监听点击,还能监听键盘内容
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <div id="example-3"><button v-on:click="say('hi')">Say hi</button>
 <button v-on:click="say('what')">Say what</button>
 </div>
 
 new Vue({
 el: '#example-3',
 methods: {
 say: function (message) {
 alert(message)
 }
 }
 })
 
 | 
组件化 component
vue可以通过小的组件来实现大的应用,组件非常类似于自定义元素。
样例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | <div id="app"><div>
 <input v-model="parentMsg">
 <br>
 <child v-bind:message="parentMsg"></child>
 </div>
 </div>
 
 <script>
 
 Vue.component('child', {
 
 props: ['message'],
 
 template: '<span>{{ message }}</span>'
 })
 
 new Vue({
 el: '#app',
 data: {
 parentMsg: '父组件内容'
 }
 })
 </script>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | <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>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | 
 
 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: '随便其它什么人吃的东西' }
 ]
 }
 })
 
 |