核心:
1、Vue.js是一个允许采用简洁的模板语法来声明式地将数据渲染进DOM系统
2、在编写代码时,你不需要关注DOM操作,只需要关注逻辑层面即可。
3、组件系统。
示例:
<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>
//注册一个“todo-item”Vue组件
Vue.component('todo-item', {
props: ['todo'],
template: '<li>{{ todo.text }}</li>'
})
//{{var}}差值表达式
var app7 = new Vue({
//接管id为app-7的DOM元素,与该DOM节点绑定
//挂载点
el: '#app-7',
//数据
data: {
groceryList: [
{ id: 0, text: '蔬菜' },
{ id: 1, text: '奶酪' },
{ id: 2, text: '随便其它什么人吃的东西' }
]
}
})
//bind属性绑定:单向绑定
//v-model:双向绑定
生命周期图示
模板语法
{{}}:差值表达式(Mustache):
- 文本:<span>Message: {{ msg }}</span>
- 原始html:<span v-html="rawHtml"></span></p>
- JS表达式:{{ ok ? 'YES' : 'NO' }}
*注意:该特性不能作用于Html特性上,遇到这种情况应该使用 v-bind 指令
指令
指令 | 功能 | 简写 | 备注 |
---|---|---|---|
v-if,v-else-if, v-else | 条件渲染 | 没有 | 用 key 管理可复用的元素 |
v-for | 遍历 | 没有 | 1、支持一个可选的第二个参数为当前项的索引<li v-for="(item, index ) in items">2、需要为每项提供一个唯一 key 属性,理想的 key 值是每项都有的唯一 id |
v-bind | 属性绑定 | : | |
v-on | 事件绑定 | @ | |
v-show | 条件渲染 | 没有 | v-show 的元素始终会被渲染并保留在 DOM 中,v-if则会销毁 |
Vue实例属性:
var app = new Vue({
//挂载点
el : "",
//数据
data : {},
//方法
methods : {},
//计算属性
computed : {},
//监听属性
watch : {}
})
class和style绑定
1、绑定从class
1、对象语法
<div class="static"
v-bind:class="{ active: isActive, 'text-danger': hasError }">
</div>
data: {
isActive: true,
hasError: false
}
结果渲染为:
<div class="static active"></div>
2、数组语法
<div v-bind:class="[activeClass, errorClass]"></div>
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
结果渲染为:
<div class="active text-danger"></div>
//注:用在组件上会在组件原基础上添加class
绑定style
1、内联绑定
1、对象语法
//v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用单引号括起来) 来命名
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
activeColor: 'red',
fontSize: 30
}
//直接绑定到一个样式对象通常更好,这会让模板更清晰
<div v-bind:style="styleObject"></div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
2、数组语法
//数组语法可以将多个样式对象应用到同一个元素上
<div v-bind:style="[baseStyles, overridingStyles]"></div>
事件修饰符
<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即元素自身触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>
2.1.4 新增
<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>
2.3.0 新增
<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
<!-- 而不会等待 `onScroll` 完成 -->
<!-- 这其中包含 `event.preventDefault()` 的情况 -->
<div v-on:scroll.passive="onScroll">...</div>
使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。
按键修饰符
<!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -->
<input v-on:keyup.13="submit">
<!-- 同上 -->
<input v-on:keyup.enter="submit">
记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名
<!-- 缩写语法 -->
<input @keyup.enter="submit">
全部的按键别名:
https://cn.vuejs.org/v2/guide/events.html
可以通过全局 `config.keyCodes` 对象[自定义按键修饰符别名](https://cn.vuejs.org/v2/api/#keyCodes):
组件*
示例
<div id="components-demo">
<button-counter></button-counter>
</div>
// 定义一个名为 button-counter 的新组件
Vue.component('button-counter', {
data: function () {
return {
count: 0
}
},
template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})
new Vue({ el: '#components-demo' })
注:
1、你可以将组件进行任意次数的复用:每个组件单独维护它的“count”,因为没用一次组件,就会有一个它的实例被创建。
2、因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。
data必须是一个函数
data: {
count: 0
}
通过props向子组件传递数据 (相当于函数的参数)
//当一个值传递给一个prop特性的时候,它就变成了那个组件实例的一个属性。
Vue.component('blog-post', {
props: ['title'],
template: '<h3>{{ title }}</h3>'
})
//使用
<blog-post title="My journey with Vue"></blog-post>
*每个组件必须只有一个“根元素”。你可以将模板的内容包裹在一个父元素内
通过事件向父级组件发送消息
调用内建的 $emit
方法并传入事件的名字,来向父级组件触发一个事件
<div id="blog-posts-events-demo">
<div :style="{ fontSize: postFontSize + 'em' }">
<blog-post
v-for="post in posts"
v-bind:key="post.id"
v-bind:post="post"
v-on:enlarge-text="postFontSize += 0.1"
></blog-post>
</div>
</div>
Vue.component('blog-post', {
props: ['post'],
template: `
<div class="blog-post">
<h3>{{ post.title }}</h3>
//向父组件发送一个“enlarge-text'”事件
<button v-on:click="$emit('enlarge-text')">
Enlarge text
</button>
<div v-html="post.content"></div>
</div>
`
})
new Vue({
el: '#blog-posts-events-demo',
data: {
posts: [
{ id: 1, title: 'My journey with Vue' },
{ id: 2, title: 'Blogging with Vue' },
{ id: 3, title: 'Why Vue is so fun' }
],
postFontSize: 1
}
})
通过插槽分发内容
Vue.component('alert-box', {
template: `
<div class="demo-alert-box">
<strong>Error!</strong>
<slot></slot>
</div>
`
})
——————————更多内容——————————————