Vue学习笔记(2019.7.31)
- Vue学习笔记(2019.7.31)
- vue
- 基本指令用法
- v-cloak v-text v-html
- v-bind v-on
- 跑马灯
- v-on
- v-model
- class
- v-for key
- v-if v-show
- filter,filters
- 键盘修饰符
- directive
- vue的生命周期
- vue-resource
- Vue中的动画
- vue组件
- 组件切换
- v-if v-else
- component:is
- 父子组件传值
- 兄弟之间的传递
- 组件插槽
- 匿名插槽
- 具名插槽
- 作用域插槽
- 购物车案例
- this.$refs
- 组件切换
- vue-router
- 路由传参
- 路由嵌套
- 命名路由
- 编程式导航
- 命名视图
- watch computed
- 计算属性缓存 vs 方法
- 基本指令用法
- webpack
- 安装
- 配置
- webpack-dev-server
- html-webpack-plugin
- webpack-dev-server配置项
- 打包其他类型文件
- 打包css、less、sass:
- 自动添加浏览器前缀postcss
- 处理css中的路径:
- 处理高级JS语法:
- 处理vue:
- 构建Vue项目
- webpack完整配置:
- webpack中vue-router
- 使用第三方组件
- 使用MintUI
- 使用MUI
- 使用boostrap
- 中间组件的切换动画
- vue中的vue-resource
- mui的tab-top-webview-main分类滑动栏问题
- lazyload,vue-preview
- 真机调试
- vue-router编程式导航
- 抽离轮播图,小球动画,传值问题
- 抽离轮播图组件
- 小球动画
- numberbox子组件传值给父组件
- 当父组件要传递给子组件的值是异步请求的值时需要子组件用watch去监听传递过来的值
- vuex 优化购物车
- vuex
- state
- getters
- mutation
- Action
- module
- vue
vue
基本指令用法
v-cloak v-text v-html
- v-cloak解决插值表达式闪烁问题
[v-cloak] {
display: none;
}
- v-text会覆盖元素中原本的内容,但是插值表达式只会替换自己的这个占位符,不会把整个元素的内容清空。
- v-html,带有html标签的字符串
1212112
v-bind v-on
- v-bind指令可以被简写为 :要绑定的属性,v-bind 中,可以写合法的JS表达式。
- v-on
跑马灯
lang() {
if (this.intervalId != null) return;
this.intervalId = setInterval(() => {
var start = this.msg.substring(0, 1)
var end = this.msg.substring(1)
this.msg = end + start
}, 400)
// 注意: VM实例,会监听自己身上 data 中所有数据的改变,只要数据一发生变化,就会自动把 最新的数据,从data 上同步到页面中去;【好处:程序员只需要关心数据,不需要考虑如何重新渲染DOM页面】
},
stop() { // 停止定时器
clearInterval(this.intervalId)
// 每当清除了定时器之后,需要重新把 intervalId 置为 null
this.intervalId = null;
}
v-on
- .stop 阻止冒泡
- .prevent 阻止默认事件
- .capture 添加事件侦听器时使用事件捕获模式
- .self 只当事件在该元素本身(比如不是子元素)触发时触发回调 (只会阻止自己身上冒泡行为的触发,并不会真正阻止 冒泡的行为)
- .once 事件只触发一次
v-model
-
v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定
-
使用 v-model 指令,可以实现 表单元素和 Model 中数据的双向数据绑定
-
v-model 只能运用在 表单元素中
{{ msg }}
class
- 数组
:class="['red', 'thin']"
- 数组中使用三元表达式
:class="['red', 'thin', isactive?'active':'']"
- 数组中嵌套对象
:class="['red', 'thin', {'active': isactive}]"
- 直接使用对象
:class="{'red':true,'thin':true,'active':isactive}"
内联样式:
直接在元素上通过 :style
的形式,书写样式对象
:style="{color: 'red', 'font-size': '40px'}"
将样式对象,定义到 data
中,并直接引用到 :style
中
v-for key
- 数组
v-for="(item, i) in list
- 迭代对象中的属性
v-for="(val, key, i) in userInfo
- 数字
v-for="i in 10"
当在组件中使用** v-for 时,key 现在是必须的。
v-if v-show
-
v-if 的特点:每次都会重新删除或创建元素
-
v-show 的特点: 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式
如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show,如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if
filter,filters
- 私有过滤器
{{item.ctime | dataFormat('yyyy-mm-dd')}}
定义方式:
filters: {
dataFormat(input, pattern = ""){
var dt = new Date(input);
// 获取年月日
var y = dt.getFullYear();
var m = (dt.getMonth() + 1).toString().padStart(2, '0');
var d = dt.getDate().toString().padStart(2, '0');
...
}
}
使用ES6中的字符串新方法 String.prototype.padStart(maxLength, fillString='') 或 String.prototype.padEnd(maxLength, fillString='')来填充字符串;
- 全局过滤器
Vue.filter(
'dataFormat',
function (input, pattern = '') {
...
}
注意:当有局部和全局两个名称相同的过滤器时候,会以就近原则进行调用,即:局部过滤器优先于全局过滤器被调用!
键盘修饰符
定义:
Vue.config.keyCodes.f2 = 113;
使用自定义的按键修饰符:
directive
- 全局自定义指令:
Vue.directive(
'focus', {
inserted: function (el) { // inserted 表示被绑定元素插入父节点时调用
el.focus();
}
});
- 自定义局部指令:
directives: {
color: {
bind(el, binding) {
el.style.color = binding.value;
}
},
'font-weight': function (el, binding2) {
// 自定义指令的简写形式,等同于定义了 bind 和 update 两个钩子函数
el.style.fontWeight = binding2.value;
}
}
使用方式:
vue的生命周期
-
beforeCreate:实例刚在内存中被创建出来,此时,还没有初始化好 data 和 methods 属性
-
created:实例已经在内存中创建OK,此时 data 和 methods 已经创建OK,此时还没有开始 编译模板
-
beforeMount:此时已经完成了模板的编译,但是还没有挂载到页面中
-
mounted:此时,已经将编译好的模板,挂载到了页面指定的容器中显示
-
运行期间的生命周期函数:
-
beforeUpdate:状态更新之前执行此函数, 此时 data 中的状态值是最新的,但是界面上显示的 数据还是旧的,因为此时还没有开始重新渲染DOM节点
-
updated:实例更新完毕之后调用此函数,此时 data 中的状态值 和 界面上显示的数据,都已经完成了更新,界面已经被重新渲染好了!
-
销毁期间的生命周期函数:
-
beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
-
destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
vue-resource
- 发送get请求:
this.$http.get('http://127.0.0.1:8899/api/getlunbo').then(res => {
console.log(res.body);
})
- 发送post请求:
this.$http.post(url,
{ name: 'zs' },
{ emulateJSON: true}).then(res => {
console.log(res.body);
});
全局配置接口和emulateJSON 选项:
- Vue.http.options.root = 'http://vue.studyit.io/';
注意:发起请求的前面不要加/了 this.$http.get('api/getprodlist').then
- Vue.http.options.emulateJSON = true;
Vue中的动画
- 使用过渡类名
-
v-enter 【这是一个时间点】 是进入之前,元素的起始状态,此时还没有开始进入
-
v-leave-to 【这是一个时间点】 是动画离开之后,离开的终止状态,此时,元素 动画已经结束了
-
v-enter-active 【入场动画的时间段】
-
v-leave-active 【离场动画的时间段】
.v-enter,
.v-leave-to {
opacity: 0;
transform: translateX(150px);
}
.v-enter-active,
.v-leave-active{
transition: all 0.8s ease;
}
这是一个H3
transition后可加name属性 修改动画的v-前缀
- 使用第三方 CSS 动画库
先导入动画类库:
再定义 transition 及属性:
动画哦
-
enter-active-class
-
leave-active-classs
-
:duration=''{enter: , leave: }'
-
animated
- 使用动画钩子函数
OK
定义三个 methods 钩子方法:
methods: {
beforeEnter(el) { // 动画进入之前的回调
el.style.transform = 'translateX(500px)';
},
enter(el, done) { // 动画进入完成时候的回调
el.offsetWidth;
el.style.transform = 'translateX(0px)';
done();
},
afterEnter(el) { // 动画进入完成之后的回调
this.isshow = !this.isshow;
}
}
- v-for 的列表过渡
transition-group 组件把v-for循环的列表包裹起来:
{{item}}
-
transition-group 添加 appear 属性,实现页面刚展示出来时候,入场时候的效果
-
通过为 transition-group 元素,设置 tag 属性,指定 transition-group 渲染为指定的元素
下面的 .v-move 和 .v-leave-active 配合使用,能够实现列表后续的元素,渐渐地漂上来的效果
.v-move{
transition: all 0.8s ease;
}
.v-leave-active{
position: absolute;
}
vue组件
- 使用 Vue.extend 配合 Vue.component 方法:
var login = Vue.extend({
template: '登录
'
});
Vue.component('login', login);
- 直接使用 Vue.component 方法:
Vue.component('register', {
template: '注册
'
});
- 字面量方式
var login= {
template:#apl
data(){
return {}
}
}
vue.component('login', login)
//或者挂在到vm的components上
组件切换
v-if v-else
component:is
使用component
标签,来引用组件,并通过:is
属性来指定要加载的组件:
注意:组件名称是字符串
父子组件传值
-
父向子传值
- 父组件定义子组件标签时bind简写绑定过去:
< son :finfo="msg"> son>
再在子组件中定义props属性(注意是数组)
props: ['finfo']
-
子向父传值(借用父向字传递方法)
- 原理:父组件将方法的引用,传递到子组件内部,子组件在内部调用父组件传递过来的方法,同时把要发送给父组件的数据,在调用方法的时候当作参数传递进去;
< son @func="getMsg"> son>
- 子组件内部通过
this.$emit('方法名', 要传递的数据)
方式,来调用父组件中的方法,同时把数据传递给父组件使用
this.$emit('func', data)
兄弟之间的传递
- 兄弟之间传递数据需要借助于事件中心,通过事件中心传递数据
- 提供事件中心 var hub = new Vue()
- 传递数据方,通过一个事件触发hub.$emit(方法名,传递的数据)
- 接收数据方,通过mounted(){} 钩子中 触发hub.$on()方法名
- 销毁事件 通过hub.$off()方法名销毁之后无法进行传递数据
父组件
地存储获取时需注意:
JSON.parse(localStorage.getItem(' cmts') || '[]')
localStorage.setItem('cmts', JSON.stringify(list))
组件插槽
- 组件的最大特性就是复用性,而用好插槽能大大提高组件的可复用能力
匿名插槽
有bug发生
有一个警告