一.父传子(父组件向子组件传递数据)
1.步骤:
(1).父传子:通过自定义属性来进行传值
(2).在父组件中使用子组件的时候,给父组件添加自定义属性,属性值为传递的数据
(3).在子组件通过使用props接受父组件的数据,props值为一个数组,元素是自定义属性
(4).在子组件中使用传递的数据时与data数据一样
代码示例如下:
父组件中:
<template>
<div class="dad-wrapper">
我是父组件
<child :com="msg"/>
</div>
</template>
<script>
import child from './child.vue';
export default{
name:'dad',
data(){
return{
msg:'我是张峻豪'
}
},
components:{
child
}
}
</script>
子组件中:
<template>
<div class="show">
{{name}},{{ age }}
<hr>
{{ com }}
</div>
</template>
<script>
export default{
name:'child',
data(){
return{
name:'朱志鑫',
age:'16'
}
},
props:['com']
}
</script>
二.子传父
1.步骤:
(1).在父组件中定义修改方法,需要传递的参数
(2).在使用子组件的时候,通过自定义事件绑定修改方法
(3).在子组件中,在需要的地方通过this.$emit('事件名‘,参数)进行广播事件,并且传递参数
(4)通过父组件中的方法,接收传递的参数,并且对数据进行修改
代码示例如下:
父组件中:
<template>
<div class="dad-wrapper">
{{ d1 }}
<child @p="change"/>
</div>
</template>
<script>
import child from './child.vue';
export default{
name:'dad',
data(){
return{
d1:[]
}
},
methods:{
change(e){
this.d1=e
}
},
components:{
child
}
}
子组件中:
<template>
<div class="show">
<button @click="commit">点击实现子传父</button>
</div>
</template>
<script>
export default{
name:'child',
data(){
return{
name:'张峻豪',
age:16
}
},
methods:{
commit(){
this.$emit('p',[this.name,this.age])
}
}
}
</script>
三.兄弟组件之间的传值
1.步骤:
(1).组件1将数据发送给父组件
(2).父组件将值传递给组件2
代码示例如下:
父组件中:
<template>
<div class="dad-wrapper">
{{ d1 }}
<child @p="change"/>
<bro :c1="d1"/>
</div>
</template>
<script>
import child from './child.vue';
import bro from './bro.vue';
export default{
name:'dad',
data(){
return{
d1:[]
}
},
methods:{
change(e){
this.d1=e
}
},
components:{
child,
bro
}
}
</script>
子组件中:
<template>
<div class="show">
<button @click="commit">点击实现子传兄弟</button>
</div>
</template>
<script>
export default{
name:'child',
data(){
return{
name:'张峻豪',
age:16
}
},
methods:{
commit(){
this.$emit('p',[this.name,this.age])
}
}
}
</script>
兄弟组件:
<template>
<div class="bro-wrapper">
<h4>{{ c1 }}</h4>
</div>
</template>
<script>
export default{
name:'bro',
data(){
return{
}
},
props:['c1']
}
</script>
四.全局事件总线:
1.步骤:
(1).创建一个空的组件
(2).在传值的组件中,用$emit()发射事件
(3)在接受值得组价中,用$on()接受事件
实现bro组件向child组件传值,代码示例如下:
在bro组件中
<template>
<div class="bro-wrapper">
<button @click="send">点击实现传输信息</button>
</div>
</template>
<script>
import bus from '@/bus';
export default{
name:'bro',
data(){
return{
message:['张峻豪','朱志鑫','余宇涵','张极']
}
},
methods:{
send(){
bus.$emit('busEvent',this.message)
}
}
}
</script>
在child组件中:
<template>
<div class="show">
<h4>{{ a1 }}</h4>
<button @click="acc">点击执行</button>
</div>
</template>
<script>
import bus from '@/bus'
export default{
name:'child',
data(){
return{
a1:''
}
},
methods:{
acc(){
bus.$on('busEvent',e=>{
this.a1=e
})
}
}
}
</script>
五.Vuex
Vuex是一个专为Vue,js应用程序开发的状态管理模式+库,它采用集中式存储管理应用的所有组件的状态,并且以一种相应的规则保证状态以一种可以预测的方式发生变化。
Vuex可以帮助我们管理共享状态,并且附带了更多的概念和框架,如果不打算开发大型单页应用,使用Vuex可能是繁琐的。如果开发一个大型单页应用,使用Vuex是高效的。
Vuex中一共有五个状态State Getter Mutation Action Module
1.State:提供唯一的公共数据源,所有的共享数据统一放到store的state中进行储存,与data相似
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
//数据,相当于data
state: {
name:"张峻豪",
age:12,
count:0
},
})
2.Mutation:更改vuex的store中的状态的唯一方法是提交mutation,vuex中的mutation类似于事件,每个mutation都有一个字符串的事件类型和一个回调函数,其中的回调函数就是我们实际进行状态更改的地方
mutations:{
addcount(state,num){
state.count=+state.count+num
},
reduce(state){
state.count--
}
},
可以使用commit触发Mutation操作
methods:{
//加法
btn(){
this.$store.commit("addcount",10)
}
//减法
btn1(){
this.$store.commit("reduce")
}
3.Action:进行异步操作,Action与Mutation相似,但是一般不用Mutation异步操作,如果想要进行异步操作,使用Action
actions:{
asyncAdd(context){
setTimeout(()=>{
context.commit("reduce")
},1000);
}
}
如果想要在组件中使用,可以直接使用dispatch触发Action函数
this.$store.dispatch("asynAdd")
4.Getter:类似于vue中的computed,可以进行缓存,对于Store中的数据进行加工处理形成一个新的数据
5.Modules:
当遇到大型项目时,数据量会很大,store就会显得非常臃肿,想要解决上述问题,Vuex允许我们将store分割成模块,每个模块拥有自己的state,mutation,action,getter,甚至是嵌套子模块。
但是在默认情况下,模块内部的action和mutation仍然是注册在全局命名空间的,这就使得多个模块能够对于同一个action和mutation作出相应。