vue--知识点总结:
目录
1. v-if与v-show的区别
2. Vue的双向数据绑定原理
3. Vue的生命周期
4. 封装 vue 组件的过程
5. 理解vuex
6.vue页面间传值
相同点:v-if与v-show都可以动态控制dom元素显示隐藏
不同点:v-if显示隐藏是将dom元素整个添加或删除,而v-show隐藏则是为该元素添加css--display:none,dom元素还在。
注意:
答:vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 具体步骤:
答:总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。
(上图是网上找的,忘了出处啦,侵删)
答:首先,组件可以提升整个项目的开发效率。能够把页面抽象成多个相对独立的模块,解决了我们传统项目开发:效率低、难维护、复用性等问题。
然后,使用Vue.extend方法创建一个组件,然后使用Vue.component方法注册组件。子组件需要数据,可以在props中接受定义。而子组件修改好数据后,想把数据传递给父组件。可以采用emit方法。
vuex的核心是:state,getter,actions,mutations
总结:mutation 只管存,你给我(dispatch)我就存;action只管中间处理,处理完我就给你,你怎么存我不管(所有的改变state状态的都是mutation 来操作);Getter 我只管取,我不改的(类似计算属性)。
一、父组件向子组件传递数据通过props
父组件:使用v-bind传值
子组件:使用props接收
父组件:
子组件:
props: {
message: String
},
二、子组件向父组件传值 (参考的vue组件之间的通信来完成,侵删)
子组件向父组件传递分为两种类型:
**父组件代码**
{{ total }}
**子组件代码**
三、同级传参的两种方式:
使用
this.$router.push({ path:'路径值' , query: { 参数名: '参数值' }})
this.$router.push({name: '路由名',params: {参数名: '参数值'}})
注意1:使用params时不能使用path
接收:
var a = this.$route.query.参数名
var b = this.$route.params.参数名
注意:接收传来的值时,最好把接收值的方法放在钩子函数中触发,或者在路由守卫beforeRouteEnter、beforeRouteLeave, 并且使用watch来监听(可以自己搜一下,在钩子函数和路由守卫中触发的区别)
代码示例:
watch: {
// 监测路由变化,只要变化了就调用获取路由参数方法将数据存储本组件即可
'$route': 'getParams'
},
beforeRouteEnter (to, from, next) {
next(vm =>{
vm.getParams();
})
},
beforeRouteLeave(to, from, next) {
next(vm =>{
vm.getParams();
});
},
methods: {
getParams:function(){
var pid = this.$route.query.pid;
},
}
注意2:实用params去传值的时候,在页面刷新时,参数会消失,用query则不会有这个问题。
四、vue组件之间使用bus(总线/观察者模式)传值
import Vue from 'vue'
const Bus = new Vue();
export default Bus
import Bus from '@/components/utils/Bus.js';
Bus.$emit('消息名', 消息值);
接受组件的事件:写在钩子函数内:例如:mounted created都可以
Bus.$on('msg', (e) => {
this.num = e;
})
五、通过设置Session Storage缓存的形式进行传递
const orderData = { 'orderId': 123, 'price': 88 }
sessionStorage.setItem('缓存名称', JSON.stringify(orderData))
const dataB = JSON.parse(sessionStorage.getItem('缓存名称'))
注意:了解一下 Session Storage(程序退出销毁) 和 Local Storage(长期保存) 的区别。
六、vuex
css和js:
*{
padding: 0;margin: 0;
}
.box{
height: 40px;
background: cyan;
}
.nav{
line-height: 40px;
display: inline-block;
margin-left: 100px;
cursor: pointer;
}
.red{
color: red;
}
//前提是必须引入vuejs哦!
var vm = new Vue({
el:"#wrap",
data:{
navLists:[
{
"text":"首页"
},
{
"text":"组件"
},
{
"text":"API"
},
{
"text":"我们"
}
],
changeRed:0
},
methods:{
reds:function(index){
this.changeRed = index;
}
}
});
2. 动态样式的解决方法
:class="{active: isActive}"
通过改变isActive是否为true和false来动态改变样式
class="[lineStyle(courseClick)]"
lineStyle(isClick){
if (isClick===true){
return 'tab-items-current'
}else {
return 'class-tab-items'
}
}
3. v-show和v-if来控制元素的显示、隐藏(上面有说明)
在vue路由中,支持3种传参方式:
getIndexInfo(id) {
// 直接调用$router.push 实现携带参数的跳转
this.$router.push({
path: `/home/${id}`,
})
// 方案一,需要对应路由配置如下:
{
path: '/home/:id',
name: 'home',
component: home
}
// 很显然,需要在path中添加/:id来对应 $router.push 中path携带的参数。
// 在子组件中可以使用来获取传递的参数值。
$route.params.id
// 父组件中:通过路由属性中的name来确定匹配的路由,通过params来传递参数。
this.$router.push({
name: 'home',
params: {
id: id
}
})
// 对应路由配置: 注意这里不能使用:/id来传递参数了,因为父组件中,已经使用params来携带参数了。
{
path: '/home',
name: 'home',
component: home
}
//子组件中: 这样来获取参数
$route.params.id
// 父组件:使用path来匹配路由,然后通过query来传递参数
这种情况下 query传递的参数会显示在url后面?id=?
this.$router.push({
path: '/home',
query: {
id: id
}
})
// 对应路由配置:
{
path: '/home',
name: 'home',
component: home
}
// 对应子组件: 这样来获取参数
$route.query.id
// 这里要特别注意 在子组件中 获取参数的时候是$route.params 而不是
$router 这很重要~~~