Vue 学习文档
Vue 学习文档
vue 起步
- 引包
- 启动
new Vue(options) - options:
el目的地(可以用类名、标签名等,也可以直接用mod元素)#elementId.elementClassdivdocument.getElementById('elementId')
template内容data数据
vue 基础语法
vue 指令
v-if是否插入元素v-show是否隐藏元素v-bind给元素属性赋值,单向数据绑定- 简写::{属性名}={属性值}
v-model在表单控件或者组件上创建双向绑定v-on绑定事件- 简写: @{事件名}={表达式/方法名}
- 传参 直接在方法名后追加
(参数) - 同时获取参数和event对象
v-on:click="warn('参数', $event)"
v-for遍历循环数组 (item, index)
循环对象 (val, key, index)
<div v-for="(item, index) in items"></div>
<div v-for="(val, key) in object"></div>
<div v-for="(val, key, index) in object"></div>
vue 组件化
使用步骤:
- 编写子组件
- 声明子组件
- 使用子组件
父组件向子组件传递数据
父组件用
v-bind传递,子组件必须props里先声明props可以设置默认值
props可以指定数据类型(String/Number/Boolean/Array/Object/Date/Symbol/Function)
const MyHeader = {
template: `<h1>我是头部</h1>`
}
const MyBody = {
template: `<h1>我是中部 {{index}}</h1>`,
//props: ['index'],
props: {
items: { // 必须提供字段
type: String, //指定类型
required: true
},
index: { // 可选字段,有默认值
type: Number,
default: 3
},
// 带有默认值的对象
propE: {
type: Object,
// 对象或数组默认值必须从一个工厂函数获取
default: function () {
return { message: 'hello' }
}
},
// 自定义验证函数
propF: {
validator: function (value) {
// 这个值必须匹配下列字符串中的一个
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
}
let app = new Vue({
el: '#demo1',
components: {
'my-header': MyHeader,
'my-body': MyBody,
'my-footer': MyFooter
},
template: `
<div>
<my-header/>
<my-body :index="tip"/>
</div>
`,
data: {
tip: 1
}
})
注册全局组件
Vue.component('组件名',组件对象)
全局组件不带 's'
过滤器-filter
全局过滤器:
Vue.filter('my-filter', function (value) {
// 返回处理后的值
})
组件内的过滤器
filters:{ '过滤器名','过滤方式fn' }- fn中的参数1是传递的数据,允许追加额外的参数
- return是返回显示的内容
- 使用:{{ myText | 过滤器名 }}
- 场景:处理后台返回数据
监控-watch
watch和v-model的区别:
- v-model仅仅是数据的同步,watch可以数据和行为挂钩
参数:(newVal,oldVal)
watch({'myText': function (newVal, oldVal) {
// 做点什么
}})
无法监视复杂数据,watch监控的是引用地址
深度监视的方法:
watch({'myText': {
deep: true,
handler: function (newVal, oldVal) {
// 旧值将与新值相同
}
}})
计算-computed
凡是函数内部有this.相关属性,改变都会触发当前函数
计算属性默认只有 getter
computed: {
// 计算属性的 getter
fullName: function () {
// `this` 指向 vm 实例
return this.firstName + ' ' + this.lastName
}
}
也可以提供一个 setter
computed: {
fullName : {
//this.firstName改变或this.lastName改变触发get方法
//this.fullName改变时执行set方法 get: function () {
return this.firstName + ' ' + this.lastName
},
set: function (newValue) {
var names = newValue.split(' ');
this.firstName: names[0];
this.lastName: names[names.length - 1];
}
}
}
具名插槽-slot
插槽可以让组件像原生标签一样使用
使用方法:定义的组件中包含
<slot>组件:
<a
v-bind:href="url"
class="nav-link"
>
<slot></slot>
</a>
使用:
<navigation-link url="/profile">
Your Profile
</navigation-link>
插槽内可以包含任何模板代码,包括 HTML
<slot>元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽可以在组件模板里的
<slot>标签内部指定默认的内容
组件生命周期
- beforeCreate 组件创建前
- created 组件创建后
- 可以操作data中的数据
- 对应父组件
v-if=true时触发
- beforeMount 组件装载前
- mounted 组件装载后
- beforeUpdate 组件更新前
- 可以获取原dom
- updated 组件更新后
- 数据发生改变触发
- 可以获取新dom
- beforeDestroy 组件销毁前
- destroyed 组件销毁后
- 对应父组件
v-if=false时触发
- 对应父组件
注意:使用
v-if频繁触发组件创建与销毁不合理,应该使用<keep-alive>包裹组件
- activated
<keep-alive>包裹的组件激活 - deactivated
<keep-alive>包裹的组件停用
获取DOM元素/组件对象-ref
在组建的DOM部分,任意的标签中写上
ref="{自定义元素名}"通过组件对象
this.$refs.{自定义元素名}获取到元素可以在mounted中操作DOM数据
在子组件标签中写入
ref="{自定义组件名}",获取到的就是组件对象Vue中DOM更新是异步的,异步导致DOM未渲染,无法操作DOM元素的解决办法
this.$nextTick(function(){
//执行
})
vue 插件
vue-router的使用
路由原理:
- 添加hashChange事件,通过location.hash控制innerHTML
vue-router使用步骤:
- 引入vue-router.js
- 安装插件
- 创建一个路由对象
- 配置路由对象
- 将配置好的路由对象关联到vue实例中
- 制定路由改变局部的位置
Vue.use(VueRouter);
var router = new VueRouter({
routes: [
{ name:'login', path: '/login',component: Login },
{ name:'register', path: '/register',component: Register }
]
})
//也可以router.addRoutes([{},{}])
var app = {
template:`<div>
<router-link to="/login">登录</router-link>
<router-link :to="{name:'register'}">注册</router-link>
<router-view></router-view>
</div>`
};
new Vue({
el: "#app",
router:router,
components:{
app:App
},
template: '<app/>'
})
url传参数
- 查询字符串
- 配置:在router-link标签中注册参数内容
<router-link :to="{name:'register',query:{id:1}}">注册</router-link> - 规则:
{ name:'register', path: '/register',component: Register } - 生成:
<a href="/register?id=1"> - 获取: 子组件中使用
this.$route.query获取参数对象
- 配置:在router-link标签中注册参数内容
- path方式
- 配置:
:to="{name:'register',params:{id:1}}" - 规则:
{ name:'register', path: '/register/:id',component: Register } - 生成:
<a href="/register/1"> - 获取:
this.$route.params
- 配置:
- 查询字符串
$router Vs. $route
- $router VueRouter路由对象
- $route 路由信息对象
嵌套路由
router-view套router-view,路由children路由
const Login = {
template: `<div>
我是登录页
<router-link :to="{name:'login.woman'}">女性登录页</router-link>
<router-view></router-view>
</div>`,
}; var router = new VueRouter({
routes: [{
name: 'login',
path: '/login',
component: Login,
children: [{
name: 'login.woman',
path: 'woman',
component: Woman
}]},
{name: 'register', path: '/register', component: MyHeader}
]
})
权限控制
router.beforeEach((to,from,next) => {})- 每次路由匹配后,渲染组件前
- to 跳转后路由信息对象
- from 跳转前路由信息对象
- next 放行
next() - next 取消用户导航
next(false) - next方法里添加参数可以重定向
next( { name:'login' } )
- 路由meta元数据 > 对于路由规则是否需要验证权限的配置
- 路由对象中和name属性同级
{meta:{isChecked:true}}
- 路由对象中和name属性同级
路由懒加载
- 优化流量,按需请求
axios
axios挂载到vue对象上:
Vue.prototype.$axios = axios;
合并请求
axios.all([getUerAccount(),getUserPermissions()])
.then(axios.spread(function(acc,pers){
//两个请求现在都完成
}));
取消请求
const CancelToken = axios.CancelToken;
const source = CancelToken.source(); // 创建标识请求的源对象 this.source = source; // 讲对象存储到组件
cancelToken: source.token, // 请求的options属性
this.source.cancel(); // 取消到之前的那个请求 //前端的断电续传,及时获取当前上传的文件大小,储存起来
var file = <input type="file"/> .files[0].slice(文件开始部分,文件结尾部分)
new FormData().append('file',file); // 后台就是接受多次文件,都往上传文件上追加
拦截器
请求拦截器:在发起请求之前,做的事
响应拦截器:在响应回来以后,做的事
axios.interceptors.request.use(function(config){
//在请求发送之前做一些事
return config;
},function(error){
//当出现请求错误是做一些事
return Promise.reject(error);
});
axios.interceptors.response.use(function(response){
//对返回的数据进行一些处理
return response;
},function(error){
//对返回的错误进行一些处理
return Promise.reject(error);
});
post发送数据为
"name='jack'"时,数据类型为formData形式参数
- this.$axios.defaults 修改公共配置
- transformRequest 加工请求体数据
- transformResponse 加工返回数据
- withCredentials:false 跨域请求默认不带cookie
- 携带token
- xsrfCookieName:'XSRF-TOKEN',//默认值
- xrsfHeadername:'X-XSRF-TOKEN',//默认值
webpack
- 源码分析
- 把所有模块的代码放入到函数中,用一个数组保存起来
- 根据require时传入的数组索引,能知道需要哪一段代码
- 从数组中,根据索引去除包含我们代码的函数
- 执行该函数,传入一个对象
module.exports - 我们的代码,按照约定,正好是用
module.exports='xxx'进行赋值 - 调用函数结束后,
module.exports从原来的空对象就有值了 - 最终
return module.exports所为require函数的返回值
Vuex
- 使用步骤
- 引入并安装vuex插件
- 创建store对象
const store = new Vuex.Store() - 配置store中的数据/存/取
- 将vuex关联到vue实例中
- 数据获取
- 数据修改
this.$store.commit()- 禁止使用
this.$store.state.xxx=直接修改
其他
SPA 单页面应用程序
- vue-router默认使用hash模式,可以使用history模式去除#
- 在history模式下,可以scroll导航后滚动
- history模式实现其实基于服务器每次返回index.html而客户端根据
location.pathname来做渲染
SEO 搜索引擎优化
- SPA下SEO必然较差
- 使用与渲染,固定的页面作为服务器响应的结果
常用点
父组件中调用子组件的方法:
- 先给子组件定义属性
ref="xxx" - 生命周期中用
this.$refs.xxx获取此子组件对象 - 由于组件是异步的,如果在created中调用会返回undefined,解决办法是
this.$nextTick(function(){ //执行 })
Element Ui组件Events事件使用方法
- 组件对象
methods中定义回调方法 - 组件标签中引入
@close="handleClose"
eventbus使用
bus.$on('event', msg => {// 执行操作})注册监听事件bus.$emit('event', msg)触发监听操作
antd Form组件---mapPropsToFields
- 子组件的mapPropsToFields可以触发父组件change事件
- mapPropsToFields 里面返回的表单域数据必须使用 this.$form.createFormField 包装。
- this.form.setFieldsValue用于在表单生成以后设置值
自定义组件内部触发组件change事件
this.$emit('change', arguments);
Vue 学习文档的更多相关文章
- Openstack api 学习文档 & restclient使用文档
Openstack api 学习文档 & restclient使用文档 转载请注明http://www.cnblogs.com/juandx/p/4943409.html 这篇文档总结一下我初 ...
- 2013 最新的 play web framework 版本 1.2.3 框架学习文档整理
Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play Frame ...
- Openstack python api 学习文档 api创建虚拟机
Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...
- .Net 官方学习文档
.Net 官方学习文档:https://docs.microsoft.com/zh-cn/dotnet/articles/welcome
- soapUI学习文档(转载)
soapUI 学习文档不是前言的前言记得一个搞开发的同事突然跑来叫能不能做个WebService 性能测试,当时我就凌乱了,不淡定啊,因为我是做测试的,以前连WebService 是什么不知道,毕竟咱 ...
- NodeJS-001-Nodejs学习文档整理(转-出自http://www.cnblogs.com/xucheng)
Nodejs学习文档整理 http://www.cnblogs.com/xucheng/p/3988835.html 1.nodejs是什么: nodejs是一个是javascript能在后台运行的平 ...
- Ext JS 6学习文档-第8章-主题和响应式设计
Ext JS 6学习文档-第8章-主题和响应式设计 主题和响应式设计 本章重点在 ExtJS 应用的主题和响应式设计.主要有以下几点内容: SASS 介绍和入门 主题 响应式设计 SASS 介绍和入门 ...
- Ext JS 6学习文档-第7章-图表
Ext JS 6学习文档-第7章-图表 使用图表 本章中将探索在 ExtJS 中使用不同类型的图表并使用一个名为费用分析的示例项目结束本章所学.以下是将要所学的内容: 图表类型 条形图 和 柱形图 图 ...
- Ext JS 6学习文档-第6章-高级组件
Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件,比如 tree 和 data view.它将为读者呈现一个示例项目为 图片浏览器,它使用 tree 和 data view 组 ...
随机推荐
- hihocoder第七周 完全背包模板题
时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 等等,这段故事为 ...
- HDU 2736 Surprising Strings
Surprising Strings Time Limit:1000MS Memory Limit:65536KB 64 ...
- 总结最近写的h5项目
其实最近最大的感触就是真正独立完结一个项目的人学到的东西是最多,但并不意味着自己已全部吸收,还是得消化消化 最近做了一个移动端的h5页面,感兴趣的可以访问看一看:http://app.500jia.c ...
- 图解MFC基本框架(深入消息映射机制)
首先,先看整体的消息流向图: 上图解释: 起点是消息循环,在winmain函数中(mfc中winmain函数是隐含的调用的,在app全局对象构造完后紧接着调用winmain函数),while循环中不断 ...
- Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined in class path resource [applicationContext.xml]
Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined ...
- csv+jenkins+ant测试接口
1.文件目录 jmeter_test case 用于存放case,csv或者txt格式,jmeter能读取的 result_log 用于存放报告 html 存放html报告 jtl 存放jtl文件 s ...
- Oracle学习笔记_02_基本SQL
1.select语句 (1)语法 SELECT *|{[DISTINCT] column|expression [alias],...} FROM table; (2)示例: 选择全部列 SELECT ...
- leetcode 226. Invert Binary Tree(递归)
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 Trivia:This problem was ...
- IDEA-Eclipse结构项目转移到 Idea教程
1.确定Idea的svn配置 2.从svn导出项目 3.检出项目完成,开始设置 4.配置完成,设置svn忽略文件,忽略掉idea配置文件等 5. 设置完毕
- 《java编程思想》:散列的原理
以实现一个简单的HashMap为例,详细讲解在code之中. 简单解释散列原理: 1.map中内建固定大小数组,但是数组并不保存key值本身,而是保存标识key的信息 2.通过key生成数组角标,对应 ...