vue中使用less
安装less依赖,npm install less less-loader --save
vue项目优化之通过keep-alive数据缓存的方法
1、缓存所有的页面,适用于每个页面都有请求的情况。方法如下,在需要缓存的router-view用keep-alive标签进行包裹起来。
1 2 3 |
|
将首次触发请求写到created钩子里边,就能实现缓存。比如从列表页,去了详情页,回来还是原来的页面。
2、缓存部分组件或者页面,使用router.meta这个属性通过判断的方法可以实现。方法如下:
1 2 3 4 5 |
|
router设置如下:
1 2 3 4 5 |
routers:[ { path: '/home', name: home, meta:{keepAlive: true} // 设置为true表示需要缓存,不设置或者false表示不需要缓存 } ] |
还可以通过新增的属性include/exclude来设置。见名思意,include包含的意思,exclude除了的意思。这里需要用到组件的名称即name来进行设置,所以name肯定就要加上了。
加入 a,b组件需要缓存,c,d组件不需要缓存。写法如下:
1 2 3 4 5 6 |
|
单个slot
除非子组件模板包含至少一个
最初在
子组件内部元素
export default {
name: 'hello',
components: {
children: {
template: '
}
}
}
我们发现写在 children模板内部的span被默认删除了。如果想让span显示那么此刻就应该使用slot。
export default {
name: 'hello',
components: {
children: {
template: '
默认效果
}
}
}
这是父组件的内容 就会插入到slot标签中 并且将slot也给替换掉
具名slot
上面案例中讲解的是当组件的模板中有一个slot的方法,那么一个组件中如果想使用多个slot那么此时就应该使用具名slot。
仍然可以有一个匿名 slot ,它是默认 slot ,作为找不到匹配的内容片段的备用插槽。如果没有默认的 slot ,这些找不到匹配的内容片段将被抛弃。
这个是默认的没有具名的solt
备案号
var Child = {
template: '
}
export default {
name: 'hello',
components: {
children: Child
}
}
可以设置多个插槽,将slot的标签内插入对应的内容,如果slot没有起名字 那么默认的就是default,渲染的时候就会把模板里面没有slot属性的内容拿过来渲染,模板里面没有slot属性的表示 slot=‘default’
vue中 关于$emit的用法
1、父组件可以使用 props 把数据传给子组件。
2、子组件可以使用 $emit 触发父组件的自定义事件。
vm.$emit( event, arg ) //触发当前实例上的事件
vm.$on( event, fn );//监听event事件后运行 fn;
例如:子组件:
父组件:
vue $refs的基本用法
new Vue({
el: "#app",
methods:{
add:function(){
this.$refs.input1.value ="22"; //this.$refs.input1 减少获取dom节点的消耗
}
}
})
一般来讲,获取DOM元素,需document.querySelector(".input1")获取这个dom节点,然后在获取input1的值。
但是用ref绑定之后,我们就不需要在获取dom节点了,直接在上面的input上绑定input1,然后$refs里面调用就行。
然后在javascript里面这样调用:this.$refs.input1 这样就可以减少获取dom节点的消耗了
vue2.0s中eventBus实现兄弟组件通信
受用eventbus的方法很是简单,我们需要做三步事情,
第一步,我们需要创造一个容器去充当我们的eventbus
第二步,我们需要去抛出,或者说提交我们的事件
第三步,我们去监听我们的那个事件(也许这才是第二部)
主要是现实途径是在要相互通信的兄弟组件之中,都引入一个新的vue实例,然后通过分别调用这个实例的事件触发和监听来实现通信和参数传递。
Apple.vue
Banana.vue组件 {{msg}}
bus.js
import Vue from 'vue'; export default new Vue();
Vue-Router来实现组件间跳转的三种方法\
通过router-link实现跳转
通过js的编程的方式 this.$router.push('/myLogin'); this.$router.replace(...) path:'/*',reidrect:'/home'
router.push(location)
想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。
router.replace(location)
跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。
v-bind:src = "" 等于 :src="" imgUrl是ajax请求的数据
错误的写法
错误的写法
正确的写法
props: 父组件给子组件传值
父组件
子组件
props:['aa'];
如果子组件想从props得到值赋值给data中的数据
如果是静态传值
methods:{
getData (){
this.default_aa == this.aa 这样就可以获取了
}
}
如果是动态传值 需要使用到watch 或者使用computed
data:function(){
return {default_aa:''}
},
props:['aa'];
methods:{},
//使用watch方式来处理props给过来的数据
watch:{
aa:function(newVal,oldVal){
this.default_aa = newVal;
}
},
//使用computed的方式
computed:{
default_aa : function(){
return this.aa;
},
},
路由获取参数
{ path: '/detail/:id/', name: 'detail', component: detail, meta: { title: '详情' } }
上面的路由获取参数的方式为 let id = this.$route.params.id
但是上面的这种方式对应的路由是 /detail/234 如果没有后面的参数值的话 页面会找不到
如果有的参数可传可不传,可以使用?传参
{ path: '/detail', name: 'detail', component: detail, meta: { title: '详情' } }
例如:http://192.168.1.12:8080/#/detail/?id=123 问号及其后面可要可不要
获取的时候:let id = this.$route.query.id 这样即使取不到参数,页面也不会报错
右击
阻止默认行为和冒泡
btn:function(b,ev){
console.log(b);
//ev.preventDefault();//取消元素默认行为
}
阻止冒泡的两种方式 @click.stop 和 event.cancelBubble = true;
show: function (ev) {
alert("show");
ev.cancelBubble = true;
},