Vue.js实战学习笔记(中)
1.递归组件
给组件设置name属性,组件就可以在它的模板内调用自己,但必须给一个条件来限制递归数量。
<div id="app">
<child-component :count="1"></child-component>
</div>
Vue.component('child-component',{
name:'child-component',
props:{
count:{
type:Number,
default:1
}
},
template:`<div class="child">
<child-component :count="count+1" v-if="count<3"></child-component>
</div>`
})
var app = new Vue({
el:"#app"
})
2.内联模板
在使用组件时,给组件标签使用inline-template特性,组件就会把它的内容当做模板,而不是把它的内容分发。
在父组件声明的数据和在子组件声明的数据都可以渲染上,作用域难理解,不能轻易使用。
3.动态组件
用元素<template>的is特性动态挂载不同的组件。
<div id="app">
<component :is="currentView"></component>
<button @click="handleChangeView('A')">切换到A</button>
<button @click="handleChangeView('B')">切换到B</button>
<button @click="handleChangeView('C')">切换到C</button>
</div>
var app = new Vue({
el:'#app',
components:{
comA:{
template:'<div>组件A</div>'
},
comB:{
template:'<div>组件B</div>'
},
comC:{
template:'<div>组件C</div>'
}
},
data:{
currentView:'comA'
},
methods:{
handleChangeView(component){
this.currentView = 'com'+component;
}
}
})
4.异步组件
vue.js允许将组件定义为一个工厂函数,动态解析组件。
vue.js只在组件需要渲染时触发工厂函数,并将结果缓存起来,用于再次渲染。
<div id="app">
<child-component></child-component>
</div>
Vue.component('child-component',function(resolve,reject){
window.setTimeout(function(){
resolve({
template:'<div>我是异步渲染的</div>' //工厂函数接收一个resolve回调
})
},2000);
});
var app = new Vue({
el:'#app'
})
5.$nextTick
Vue异步更新DOM;
用$nextTick能知道什么时候DOM更新完成
this.$nextTick(...)
6.X-Template
Vue提供了另一种定义模板的方式:
在<script>标签里使用text/x-template类型,并指定一个id,将id赋值给template
<script type="text/x-template" id="my-component">
<div>这是组件的内容</div>
</script>
在<script>标签内可以直接写HTML代码,不用考虑换行问题,但不建议使用。
7.手动挂载实例
Vue提供Vue.extend和$mount两个方法来手动挂载一个实例
Vue.extend是基础Vue构造器,创建一个“子类”,参数是一个包含组件选项的对象。
如果Vue实例在实例化时没有el选项,就处于“未挂载”状态,用$mount手动挂载一个未挂载的实例。
<div id="mount-div"></div>
var myComponent = Vue.extend({
template:'<div>Hello:{{name}}</div>',
data(){
return{
name:'lyf'
}
}
});
new myComponent().$mount('#mount-div');
8.watch监听
watch选项用来监听某个prop或data的改变,当它们发生变化,就会触发watch配置的函数
9.自定义指令
全局注册:
Vue.directive('focus',{
//指令选项
})
局部注册:
var app = new Vue({
el:'#app',
directives:{
focus:{
//指令选项
}
}
})
10.自定义指令的选项
自定义的选项是由几个钩子函数组成的,每个都是可选的
bind:只调用一次,指令第一次绑定到元素时调用,可以定义一个在绑定时执行一次的初始化动作。
inserted:被帮顶元素插入父节点时调用。
update:被帮顶元素所在的模板更新时调用,不论绑定值是否变化。
componentUpdated:被绑定元素所在模板完成一次更新周期时调用。
unbind:只调用一次,指令与元素解绑时调用。
11.实时时间转换指令v-time
12.render函数
在Vue组件里可以这样写:
Vue.component('my-component',{
props:{},
render:function(createElement){
return createElement(
'h'+this.level,
[
createElement(
'a',
{
domprops:{
href:'#'+this.title
}
},
this.$slots.default
)
]
)
}
});
var app = new Vue({
el:'#pp'
})
render函数通过createElement参数来创建虚拟DOM
13.createElement用法
createElement构成了Vue虚拟DOM的模板,有三个参数:
第一个参数必选,可以是一个HTML标签、一个组件或函数;第二个参数可选,是数据对象,在template中使用;第三个参数可选,是子节点。
之前对于v-bind:class、v-bind:style、v-bind:click等都是放在组件的template选项的元素标签上,使用render函数后,可以这样写:
Vue.component('ele',{
render:function(createElement){
return createElement(
'div',
{
//动态绑定class,同:class
class:{
'show':this.show
},
//普通HTML特性
attrs:{
id:'element'
},
//给div绑定click事件
on:{
click:this.handleClick
},
},
'文本内容'
)
}
})
14.函数化组件
使用函数化组件时,render函数提供第二个参数context来提供临时上下文。组件需要的data、props等都是通过这个上下文来传递的,比如this.level会改写成context.props.level。
15.JSX
Vue.js提供babel-plugin-transform-vue-jsx来支持JSX语法。
new Vue({
el:'#app',
render(h){
return (
<Anchor level={1}>
<span>一级</span>标题
</Anchor>
)
}
})
这里使用了ES5语法缩写了函数,参数h不能省略。
16.export和import
用来导出和导入模块,一个模块就是一个js文件
17.webpack基础配置
首先在桌面新建一个目录demo,输入命令npm init,之后生成一个package.json文件;
之后本地局部安装webpack:
npm install webpack --save-dev
然后再在本地局部安装webpack-dev-server:
npm install webpack-dev-server --save-dev
操作之后,package.json文件里多了一项配置:
"devDependencies": {
"webpack": "^4.39.3",
"webpack-dev-server": "^3.8.0"
}
18.箭头函数
render:h=>h(App)
等同于render:function(h){ return h(Aapp) }
等同于render:h=>{ return h(App) }
19.前端路由和v-router
通过npm安装vue-router:
npm install --save vue-router
使用:
import VueRouter from 'vue-router';
Vue.use(VueRouter);
在ES6中使用let和const声明变量,作用域是块
20.跳转router-link
<router-link to="/about">跳转到about</router-link>
to是一个prop,指定需要跳转的路径
其他prop:
tag:可以指定渲染成什么标签 tag="li"
replace:使用replace不会留下history记录,所以导航后不能用后退键返回上一个页面
active-class:可以修改默认的名称
还有一种:this.$router.push()
JavaScript中的:window.location.href()
21.router.beforeEach
某些页面需要校验是否登录,登录了可以访问,否则跳转到登录页面,通过localstorage来简易判断是否登录
router.beforeEach((to,from,next)=>{
if(window.localStorage.getItem('token')){
next();
}else{
next('/login');
}
})
22.状态管理vuex
用npm安装vuex:
npm install --save vuex
使用:
import Vuex from 'vuex';
Vue.use(Vuex);
数据放在vuex的state里:
export default new Vuex.store({
state:{
count:0
}
})
然后在任何组件内可以用$store.state.count读取:
<div>{{ $store.state.count }}</div>
在业务中用到时一般会先在计算属性中读取到,然后再绑定到组件上进行渲染页面:
<div>{{count}}</div>
computed:{
count(){
return this.$store.state.count;
}
}
要想修改state中的数据,需要vuex的第二个选项mutations:
const store = new Vuex.Store({
state:{
count:0
},
mutations:{
increment(state){
state.count ++
},
decrease(state){
state.count --
}
}
})
在组件内通过this.$store.commit方法来执行mutations
比如在index.vue页面有两个按钮用来加减,每个按钮有个方法,在每个方法里就可以执行mutations里的两个方法了:
handleIncrement(){
this.$store.commit('increment')
}
handleDecrease(){
this.$store.commit('decrease')
}
mutations还有第二个参数,第二个参数可以是固定值也可以是一个对象,也可以是当没有传入参数是固定值,传入参数就是该参数:
mutations:{
increment(state,n=1){
state.count += n;
}
}
mutations:{
increment(state,n){
n = n||1;
state.count += n;
}
}
mutations:{
increment(state,params){
state.count += params.count;
}
}
23.this.$nextTick( function () {} )
等页面dom全部加载完之后执行这个函数,Vue自带的函数。
this.$nextTick(function () {
_this.tableHeight = _this.$utils.tableHeight (_this.$refs.addbtn.offsetHeight,_this.$refs.card.offsetHeight,148)
})
Vue.js实战学习笔记(中)的更多相关文章
- 两万字Vue.js基础学习笔记
Vue.js学习笔记 目录 Vue.js学习笔记 ES6语法 1.不一样的变量声明:const和let 2.模板字符串 3.箭头函数(Arrow Functions) 4. 函数的参数默认值 5.Sp ...
- 两万字Vue.js基础学习笔记(二)
Vue.js学习笔记(二) 4.模块化开发 ES6模块化的导入和导出 我们使用export指令导出了模块对外提供的接口,下面我们就可以通过import命令来加载对应的这个模块了 首先,我们需要在HTM ...
- 从零开始学习Vue.js,学习笔记
一.为什么学习vue.js methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节. vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn ...
- vue.js初始学习笔记&vue-cli
笔记一下: vue.js 安装,参考: http://www.cnblogs.com/wisewrong/p/6255817.html (vue-cli) http://www.cnblogs.com ...
- vue.js路由学习笔记
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- vue.js路由学习笔记二
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- vue.js 源代码学习笔记 ----- 工具方法 lang
/* @flow */ // Object.freeze 使得这个对象不能增加属性, 修改属性, 这样就保证了这个对象在任何时候都是空的 export const emptyObject = Obje ...
- vue.js 源代码学习笔记 ----- 工具方法 env
/* @flow */ /* globals MutationObserver */ import { noop } from 'shared/util' // can we use __proto_ ...
- vue.js 源代码学习笔记 ----- html-parse.js
/** * Not type-checking this file because it's mostly vendor code. */ /*! * HTML Parser By John Resi ...
随机推荐
- NLP(八) 创建自然语言处理管道
一条管道可以被看作一个多阶段的数据流系统,其中一个组件的输出被视为另一个组件的输入 管道特点: 数据始终从一个组件流向另一个组件 组件是一个只考虑输入和输出数据的黑盒 NLP管道应有的功能: 采集输入 ...
- 牛客小白月赛6 水题 求n!在m进制下末尾0的个数 数论
链接:https://www.nowcoder.com/acm/contest/135/C来源:牛客网 题目描述 其中,f(1)=1;f(2)=1;Z皇后的方案数:即在Z×Z的棋盘上放置Z个皇后,使其 ...
- codeforces 19 D. Points(线段树+set二分)
题目链接:http://codeforces.com/contest/19/problem/D 题意:给出3种操作:1)添加点(x,y),2)删除点(x,y),3)查询离(x,y)最近的右上方的点. ...
- Python中流程控制语句之IF语句
生活中经常遇到的各种选择和判断在程序中也会遇到,比如玩色子,猜大小,比如选择哪条路回家?Python程序中同样也会遇到.IF语句就是用作条件判断的控制语句. 语法一: if 条件: # 引号是将条件与 ...
- Net基础篇_学习笔记_第十一天_面向对象(关键字new和this)
new关键字 new:用来创建对象的.Person zsPerson=new Person();new帮助我们做了3件事儿:1).在内存中开辟一块空间2).在开辟的空间中创建对象3).调用对象的构造 ...
- java树形结构工具类
一.树形结构数据一般都是以子父id的形式存在数据库中,查询的时候只是带有子id和parent_id的List集合 并不是树形结构,所以我们现在要将普通的List集合转换为树结构数据(本工具类扩展操作树 ...
- 学生管理系统——ArrayList集合
此学生管理系统利用了集合ArrayList实现了对学生的增删改查:利用数组中的方法实现分数排序:运用String类的equals实现登录功能的字符串比较. 管理员类: package data; pu ...
- 运行pytest,报错"AttributeError: 'module' object has no attribute 'xxx'"
最近学习pytest被此问题困扰,敲脑壳,实在是不该.百度解决方法一大堆,我的问题怎么也解决不了,来看一下,我是怎么解决的,各位大佬勿喷,只是自己做笔记用,谢谢. 报错信息如下: 网上解决方法是这样的 ...
- vue -- vue-cli webpack项目打包后自动压缩成zip文件
用vue2.0开发项目,使用npm run build 命令 ,但是只会生成dist文件夹,以下是生成zip压缩包方法 1,插件安装 webpack插件安装 filemanager-webpack-p ...
- Java面试-interrupt
我们都知道,Java中停止一个线程不能用stop,因为stop会瞬间强行停止一个线程,且该线程持有的锁并不能释放.大家多习惯于用interrupt,那么使用它又有什么需要注意的呢? interrupt ...