英文官网: https://vuejs.org/
中文官网: https://cn.vuejs.org/
动态构建用户界面的渐进式 JavaScript 框架
作者: 尤雨溪
遵循 MVVM 模式
编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发
它本身只关注 UI, 也可以引入其它第三方库开发项目
借鉴 Angular 的模板和数据绑定技术
借鉴 React 的组件化和虚拟 DOM技术
vue-cli: vue 脚手架
vue-resource
axios
vue-router: 路由
vuex: 状态管理
element-ui: 基于 vue 的 UI 组件库(PC 端)
html 中包含了一些 JS 语法代码,语法分为两种,分别为:
插值语法(双大括号表达式)
指令(以 v-开头)
功能: 用于解析标签体内容
语法: {{xxx}} ,xxxx 会作为 js 表达式解析
功能: 解析标签属性、解析标签体内容、绑定事件
举例:v-bind:href = ‘xxxx’ ,xxxx 会作为 js 表达式被解析
说明:Vue 中有有很多的指令,此处只是用 v-bind 举个例子
语法:v-bind:href =“xxx” 或简写为 :href
特点:数据只能从 data 流向页面
语法:v-mode:value=“xxx” 或简写为 v-model=“xxx”
特点:数据不仅能从 data 流向页面,还能从页面流向 data
M:模型(Model) :对应 data 中的数据
V:视图(View) :模板
VM:视图模型(ViewModel) : Vue 实例对象
v-on:xxx=“fun”
@xxx=“fun”
@xxx=“fun(参数)”
默认事件形参: event
隐含属性对象: $event
.prevent : 阻止事件的默认行为 event.preventDefault()
.stop : 停止事件冒泡 event.stopPropagation()
keycode : 操作的是某个 keycode 值的键
.keyName : 操作的某个按键名的键(少部分)
要显示的数据不存在,要通过计算得来。
在 computed 对象中定义计算属性。
在页面中使用{{方法名}}来显示计算的结果。
通过通过 vm 对象的$watch()或 watch 配置来监视指定的属性
当属性变化时, 回调函数自动调用, 在函数内部进行计算
在应用界面中, 某个(些)元素的样式是变化的
class/style 绑定就是专门用来实现动态样式效果的技术
:class=‘xxx’
表达式是字符串: ‘classA’
表达式是对象: {classA:isA, classB: isB}4. 表达式是数组: [‘classA’, ‘classB’]
:style="{ color: activeColor, fontSize: fontSize + ‘px’ }"
其中 activeColor/fontSize 是 data 属性
v-if 与 v-else
v-show
如果需要频繁切换 v-show 较好
当条件不成立时, v-if 的所有子节点不会解析(项目中使用)
遍历数组: v-for / index
遍历对象: v-for / key
功能: 对要显示的数据进行特定格式化后再显示
注意: 并没有改变原本的数据, 是产生新的对应的数据
`Vue.directive('my-directive', function(el, binding){
el.innerHTML = binding.value.toupperCase()
})
directives : {
'my-directive' : {
bind (el, binding) {
el.innerHTML = binding.value.toupperCase()
}
}
}
1)使用指令
v-my-directive=‘xxx’
*beforeCreate()
*created()
*beforeMount()
*mounted()
* beforeUpdate()
*updated()
3.销毁 vue 实例: vm.$destory()
* beforeDestory()
* destoryed()
mounted(): 发送 ajax 请求, 启动定时器等异步任务
beforeDestory(): 做收尾工作, 如: 清除定时器
理解: 向外提供特定功能的 js 程序, 一般就是一个 js 文件
为什么: js 文件很多很复杂
作用: 复用 js, 简化 js 的编写, 提高 js 运行效率
理解: 用来实现局部(特定)功能效果的代码集合(html/css/js/image……)
为什么: 一个界面的功能很复杂
作用: 复用编码, 简化项目编码, 提高运行效率
当应用中的 js 都以模块来编写的, 那这个应用就是一个模块化的应用。
2.1.4. 组件化
当应用中的功能都是多组件的方式来编写的, 那这个应用就是一个组件化的应用,。
模板编写没有提示
没有构建过程, 无法将 ES6 转换成 ES5
不支持组件的 CSS
真正开发中几乎不用
1. 模板页面
页面模板
2. JS 模块对象
3. 样式
引入组件
improt Xxx from "@/components/xxx.vue"
映射成标签
export default{
components:{Xxx}
}
3.使用组件标签
Vue 脚手架是 Vue 官方提供的标准化开发工具(开发平台)。
最新的版本是 5.x。
文档: https://cli.vuejs.org/zh/。
第一步(仅第一次执行):全局安装@vue/cli。
npm install -g @vue/cli
第二步:切换到你要创建项目的目录,然后使用命令创建项目
vue create xxxx
第三步:启动项目
npm run serve
备注:
如出现下载缓慢请配置 npm 淘宝镜像:
npm config set registry https://registry.npm.taobao.org
Vue 脚手架隐藏了所有 webpack 相关的配置,若想查看具体的 webpakc 配置,
请执行:vue inspect > output.js
1. 作用:**用于给节点打标识
**2. 读取方式:**this.$refs.xxxxxx
**作用:**用于父组件给子组件传递数据
读取方式一: 只指定名称
props: [‘name’, ‘age’, ‘setName’]
props: {
name: String,
age: Number,
setNmae: Function
}
props: {
name: {type: String, required: true, default:xxx},
}
mixin.js相当于封装模块化,以便js代码复用
在相应组件引入mixin.js,并使用相应功能
mixins:['xx','yy']
Vue 插件是一个包含 install 方法的对象
通过 install 方法给 Vue 或 Vue 实例添加方法, 定义全局指令等
组件化编码流程(通用)
1.实现静态组件:抽取组件,使用组件实现静态页面效果
2.展示动态数据:
2.1. 数据的类型、名称是什么?
2.2. 数据保存在哪个组件?
3.交互——从绑定事件监听开始
1、绑定事件监听
或者 this.$refs.header.$on('addTodo', this.addTodo)
2、触发事件
this.$emit('addTodo', todo)
1) $on(eventName, listener): 绑定自定义事件监听
2) $emit(eventName, data): 分发自定义事件
3) $off(eventName): 解绑自定义事件监听
4) $once(eventName, listener): 绑定事件监听, 但只能处理一次
所有组件实例对象的原型对象的原型对象就是 Vue 的原型对象
1)所有组件对象都能看到 Vue 原型对象上的属性和方法
2)Vue.prototype. b u s = n e w V u e ( ) , 所 有 的 组 件 对 象 都 能 看 到 bus = new Vue(), 所有的组件对象都能看到 bus=newVue(),所有的组件对象都能看到bus 这个属性对象
全局事件总线
1)包含事件处理相关方法的对象(只有一个)
2)所有的组件都可以得到
new Vue({
beforeCreate () {
// 尽量早的执行挂载全局事件总线对象的操作 Vue.prototype.$globalEventBus = this
},
}).$mount('#root')
this.$globalEventBus.$on('deleteTodo',this.deleteTodo)
this.$globalEventBus.$emit('deleteTodo',this.index)
this.$globalEventBus.$off('deleteTodo')
这种方式的思想与全局事件总线很相似
它包含以下操作:
(1) 订阅消息 --对应绑定事件监听
(2) 发布消息 --分发事件
(3) 取消消息订阅 --解绑事件监听
在线文档: https://github.com/mroderick/PubSubJS
下载: npm install -S pubsub-js
相关语法
(1) import PubSub from 'pubsub-js' // 引入
(2) PubSub.subscribe(‘msgName’, functon(msgName, data){ })
(3) PubSub.publish(‘msgName’, data) //发布消息, 触发订阅的回调函数调用
(4) PubSub.unsubscribe(token) //取消消息的订阅
操作 css 的 trasition 或 animation
vue 会给目标元素添加/移除特定的 class
过渡的相关类名:
xxx-enter-active: 指定显示的 transition
xxx-leave-active: 指定隐藏的 transition
xxx-enter/xxx-leave-to: 指定隐藏时的样式
在目标元素外包裹
定义 class 样式
a) 指定过渡样式: transition
b) 指定隐藏时的样式: opacity/其它
使用代理服务器
https://api.github.com/search/users?q=xxx
通用的 Ajax 请求库, 官方推荐,使用广泛
vue 插件库, vue1.x 使用广泛,官方已不维护。
效果一(不使用插槽):
父组件向子组件传递带数据的标签,当一个组件有不确定的结构时, 就需要使用 slot 技术,注意:插槽内容是在父组件中编译后, 再传递给子组件的。
默认插槽
命名插槽
作用域插槽
概念:专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应 用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。
Github 地址: https://github.com/vuejs/vuex
多个组件依赖于同一状态
来自不同组件的行为需要变更同一状态
vuex 管理的状态对象
它应该是唯一的
示例代码:
const state = {
xxx:initValue
}
值为一个对象,包含多个响应用户动作的回调函数
通过 commit( )来触发 mutation 中函数的调用, 间接更新 state
如何触发 actions 中的回调?
在组件中使用: $store.dispatch('对应的action回调名')
触发
可以包含异步代码(定时器, ajax 等等)
示例代码:
const actions = {
zz({commit,state},data1){
commit('YYY',{data1})
}
}
值是一个对象,包含多个直接更新 state 的方法
谁能调用 mutations 中的方法?如何调用?
在 action 中使用:commit('对应的 mutations方法名')
触发
mutations 中方法的特点:不能写异步代码、只能单纯的操作 state
示例代码:
const mutations = {
YYY(state,{data1}){
//更新state的某个属性
}
}
值为一个对象,包含多个用于返回数据的函数
如何使用?—— $store.getters.xxx
示例代码:
const getters = {
mmm(state){
return state.msg + '!';
}
}
包含多个 module
一个 module 是一个 store 的配置对象
与一个组件(包含有共享数据)对应
//在store文件下index.js中创建store
import Vue from ’vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
modules:{
xx,
yy,
}
})
export default store
vue 的一个插件库,专门用来实现 SPA 应用
单页 Web 应用(single page web application,SPA)。
整个应用只有一个完整的页面。
点击页面中的导航链接不会刷新页面,只会做页面的局部更新。
数据需要通过 ajax 请求获取。
1. 什么是路由?
一个路由就是一组映射关系(key - value)
key 为路径, value 可能是 function 或 component
2. 路由分类
后端路由:
1)理解:value 是 function, 用于处理客户端提交的请求。
2)工作过程:服务器接收到一个请求时, 根据请求路径找到匹配的函数
来处理请求, 返回响应数据。
1) 理解:value 是 component,用于展示页面内容。
2) 工作过程:当浏览器的路径改变时, 对应的组件就会显示。
定义路由组件
注册路由
使用路由
相关 API:
this.$router.push(path)
: 相当于点击路由链接(可以返回到当前路由界面)
this.$router.replace(path)
: 用新路由替换当前路由(不可以返回到当前路由界面)
this.$router.back()
: 请求(返回)上一个记录路由
this.$router.go(-1)
: 请求(返回)上一个记录路由
this.$router.go(1)
: 请求下一个记录路由
Vant https://youzan.github.io/vant
Cube UI https://didi.github.io/cube-ui
Mint UI http://mint-ui.github.io
ue 是 component,用于展示页面内容。
2) 工作过程:当浏览器的路径改变时, 对应的组件就会显示。
定义路由组件
注册路由
使用路由
相关 API:
this.$router.push(path)
: 相当于点击路由链接(可以返回到当前路由界面)
this.$router.replace(path)
: 用新路由替换当前路由(不可以返回到当前路由界面)
this.$router.back()
: 请求(返回)上一个记录路由
this.$router.go(-1)
: 请求(返回)上一个记录路由
this.$router.go(1)
: 请求下一个记录路由
Vant https://youzan.github.io/vant
Cube UI https://didi.github.io/cube-ui
Mint UI http://mint-ui.github.io
Element UI https://element.eleme.cn
IView UI https://www.iviewui.com