Sicilia
Vue
Vue是一套用于构建用户界面的渐进式框架。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

模板语法
Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
在底层的实现上,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少。
模板语法
<span>Message: {{ msg }}</span>
<p v-if="seen">现在你看到我了</p>
绑定文本
指令
……
模板语法
<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' }
]
}
})

计算属性
模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护:
<div id="example">
{{ message.split('').reverse().join('') }}
</div>
当模板内部的逻辑比较复杂的时候,应该使用计算属性
计算属性
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
...
data: {
message: 'Hello'
},
computed: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
...

计算属性 VS 方法
我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是:
- 计算属性基于依赖进行缓存的
- 只有相关依赖发生改变时它们才会重新求值
这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
组件

组件
定义一个button-counter组件,并在Vue中注册后,就可以任意次的复用
<div id="components-demo">
<button-counter></button-counter>
<button-counter></button-counter>
<button-counter></button-counter>
</div>

Vue Loader
vue-loader 是一个 webpack 的 loader,可以将用某种格式编写的 Vue 组件转换为 JavaScript 模块

- 默认支持ES2015
- 允许对Vue组件的组成部分使用其它 webpack loader
- .vue 文件中允许自定义节点,然后使用自定义的 loader 进行处理
- 对每个组件模拟出 CSS 作用域
- ……
Vue loader Support
Webpack
Webpack 是一个模块打包工具。它将一堆文件中的每个文件都作为一个模块,找出它们的依赖关系,将它们打包为可部署的静态资源。

Webpack
可以想像我们有一些 CommonJS 模块,它们不能直接在浏览器中运行,所以我们需要打包成一个文件,这样就可以通过 <script> 标签加载。webpack 可以遵循 require() 调用的依赖关系,为我们完成这些工作。
Webpack
- 转换 ES2015,CoffeeScript 或者 TypeScript 模块为普通的 ES5 CommonJS 模块
- 可以选择在编译之前检验你的源代码,比如eslint
- 处理 HTML 或者 CSS 中引用的图片,移动到配置的路径中,并且使用 md5 hash 重命名
- 更方便地结合第三方库,使用npm管理包
Webpack允许我们
Use Vue loader
Vue提供了vue cli来方便地创建Vue loader项目
npm install -g @vue/cli
vue create hello-vue
默认的项目模板基本可以满足开发所需
Vuex
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

State
Vuex 使用单一状态树,一个对象包含了全部的应用层级状态。这也意味着,每个应用将仅仅包含一个 store 实例。单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照。
获取State
从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态
const Counter = {
template: `<div>{{ count }}</div>`,
computed: {
count () {
return this.$store.state.count
}
}
}
每当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM
获取State
当一个组件需要获取多个状态时候,我们可以使用 mapState 辅助函数帮助我们生成计算属性:
import { mapState } from 'vuex'
export default {
// ...
computed: mapState({
// 箭头函数可使代码更简练
count: state => state.count,
// 传字符串参数 'count' 等同于 `state => state.count`
countAlias: 'count',
})
}
获取State
当一个组件需要获取多个状态时候,我们可以使用 mapState 辅助函数帮助我们生成计算属性:
import { mapState } from 'vuex'
export default {
// ...
computed: mapState({
// 箭头函数可使代码更简练
count: state => state.count,
// 传字符串参数 'count' 等同于 `state => state.count`
countAlias: 'count',
})
}
Mutation
更改状态的唯一方法是提交 mutation。每个mutation都有一个事件类型和一个回调函数。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数
Mutation
首先需要注册一个类型为increment的Mutation
mutations: {
increment (state) {
// 变更状态
state.count++
}
}
要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法
store.commit('increment')
Notice
Mutation 必须是同步函数
如果我们需要用日志记录每一条 mutation ,需要捕捉到前一状态和后一状态的快照。如果mutation 中存在异步函数,这是不可能完成的:因为当 mutation 触发的时候,回调函数还没有被调用,devtools 不知道什么时候回调函数实际上被调用,这导致实质上任何在回调函数中进行的状态的改变都是不可追踪的。
Action
在 Mutation 中混合异步调用会导致你的程序很难调试。这就是为什么我们要区分Action和Mutation这两个概念。在 Vuex 中,mutation 都是同步事务,而Action负责处理异步操作。
Action
Action 类似于 Mutation,不同在于:
- Action 提交的是 Mutation,而不是直接变更状态。
- Action 可以包含任意异步操作。
Action
同样地,Action需要进行注册
actions: {
incrementAsync ({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
}
store.dispatch('incrementAsync', {
amount: 10
})
然后进行分发
Thanks
deck
By Fan Shi
deck
- 884