vue组件之间的传值

vue组件之间的传值

1.父向子传值----通过poprs属性

父组件:
1.png

子组件:
2.png
###父组件(占位符)上通过:属性名="属性值"来传给子组件
 <home :ll='layout' :ll2='"qqqq"'></home>

###子组件通过props来接受可以为数组或者对象
//方法一
props:[' ll','ll2']

//方法二
 props: {
    ll: {type: String,default:'qqqqqq' },
    ll2:{type:String,required:true}
  },

2.子向父传值----通过子级触发父级的事件携带参数来传值

父组件:

4.png
6.png

子组件:


3.png
5.png
###父组件中
//1.标签上添加触发函数。例如:@ff="show"   
//2.在methods中定义函数show
<home @ff='show'></home>

 methods:{
      show(qq){
          console.log('接收子组件的值',qq);
          this.fhome=qq
      }
  }


###子组件中
//1.标签上添加触发函数。例如:@click="tofather"   
//2.在methods中定义函数tofather
//3.在函数tofather中,,通过this.$emit()来触发父组件中的ff函数,且携带阐述,以此来达到参数的传递,例如:this.$emit('ff','hh')

 <button @click="tofather">home=>layout传值</button>

 methods:{
    tofather(){
      this.$emit('ff',"hh")
    },
 }

3.非父子之间的传值---通过bus中间人 (可定义一个.js文件,也叫事件总线)

注意:使用此方法传值的两个组件必须是同时存在(其中一个组件不能销毁,不能是通过漏油的方式加载)

A组件传值到B组件

方法一:bug中间人直接在main.js里面注册 全局注册

main.js :声明一个新的Vue实例对象,并且挂载到Vue的原型上

7.png

组件A(传参方):A组件的点击事件。让Bus.$emit()触发一个mp的事件并携带参数

8.png

组件B(接受方):B组件通过Bus.$on()来监听mp事件的是否触发。并接收参数

9.png

方法一:bug中间人在自定义一个.js文件

10.png

4.vuex中数据的共享

4.1.state中的数据 ======>store中的数据仓库

介绍:单一状态树 > 用一个对象包含了所有应用层级的状态,作为唯一的数据源 > 利于我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个应用状态的快照 

在组件中可以通过:

###方法一  直接获取
$store.state.数据名

###分离文件后的方法
//文件名:分离出来的文件的名。
//数据名:state里面的键
$store.state.文件名.数据名


###方法二   通过计算属性 computed
//1.先引入,,,将数据以计算属性的方式。当成自己的data值使用
import  {mapState}  from "vuex";
//在computed中展开
computed:{
    ...mapState({ 自定义名称: ["数据名"] }) //取别名
    //直接使用
    ...mapState( ["数据名"] ) 
}
//例如:
computed:{
    ...mapState({ qq: ["login"] }) 
}

###分离文件后的方法
//1.先引入,,,将数据以计算属性的方式。当成自己的data值使用
import  {mapState}  from "vuex";
//在computed中展开
computed:{
    ...mapState({ 自定义名称: ["文件名"] }) 
}
//例如:
computed:{
    ...mapState({ aa: ["user"] }) 
}
###另一写法
computed:{
    ...mapState({
          add: state => state.add,
          counts: state => state.counts
        })
}


4.2.mutations的操作=======>更改 Vuex 的 store 中的状态的唯一方法

不能写异步操作

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation
每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)
这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数
你需要以相应的 type 调用 store.commit 方法
1. payload (提交载荷))
    你可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload)
    载荷应该是一个对象,这样可以包含多个字段

规则:
    vuex中的store中的状态是响应式的,那么当我们变更状态的时候,监视状态的Vue
    组件也会自动更新,这也意味着Vuex中的mutation也需要与使用Vue一样遵守一些注意事项

    1. 最好提前在你的store中初始化所有所需属性
    2. 当需要在对象上添加新属性时,你应该用新对象替换老对象

Mutation必须是同步函数
    一条重要的原则就是要记住 mutation 必须是同步函数
    为什么: 如果mutation是异步函数,那么回调函数的执行难以控制,这就导致状态的改变不可追踪
    本质: 实质上任何在回调函数中进行的状态的改变都是不可追踪的

执行代码:

###vuex中的写法:
mutations:{
    函数名(state,'传参'){
        执行代码块。。。
    }
}


###方法一:直接触发:
//组件通过$store.commit()
//commit:同步操作,写法:this.$store.commit('mutations方法名',参数值)

###方法二:通过导入mapMutattions函数。将需要的Mutattions函数,映射为当前组件的methods方法
//1.引入
import  {mapMutations}  from "vuex";
methods:{
    ...mapMutations(['ADD'],['ADD1'])
    
    this.ADD('参数')
}
###方法二
methods:{
    ...mapMutations({
        'ADD': 'ADD'
      })
    
     this.ADD('参数')
}

4.3.actions 的操作=======>用于处理异步操作

1. action提交的是mutation,而不是直接变更状态
2. action可以包含任意异步操作
3. Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters

分发Action
    Action 通过 store.dispatch 方法触发
    Actions 支持同样的载荷方式和对象方式进行分发
###vuex中写法:
actions:{
    函数名:(context,'传参'){//context相当于当前的vuex.store实例对象
        异步函数(()=>{
            context.commit('mutations的执行函数')
        })  
    }
}

###使用方法一

//将 this.commonActionGet() 映射为 this.$store.dispatch('事件函数名','传参')

methods:{
    this.$store.dispatch('事件函数名','传参')
}
###使用方法二:通过导入mapActions函数。将需要的actions函数,映射为当前组件的methods方法
//引入计算属性
import  {mapActions}  from "vuex";
methods:{
     ...mapActions(['事件1', '事件2', '事件2', '事件4']),
     触发事件函数(){
        this.事件1()
        this.事件2()
        this.事件2()
    }
    
}

// 第二种方式
methods:{
    ...mapActions({
         '自定义名称1': '事件1',
         '自定义名称2': '事件2',
         '自定义名称3': '事件3',
         '自定义名称4': '事件4'
       }),
    触发事件函数(){
        this.自定义名称1()
        this.事件2()
    }
  
}


      

4.4. getter的操作 =======>用于用户地store中的数据进行加工处理形成新的数据

​ 1.Getter可以对Store中已有的数据加工处理形成新的数据。类似Vue的计算属性

​ 2.store中数据发生变化,Getter的数据也会跟着变化

###vuex中:
getter:{
    事件名:state =>{
        return state.变量名
    }
}

###使用方法一:直接使用
this.$store.getter.名称  //名称为:getter的事件名

###使用方法二:通过导入mapGetters函数。将需要的getters函数,映射为当前组件的computed方法
//引入
improt {mapGetters} from "vuex"

computed:{
    ...mapGetters(['名称'])//名称为:getter的事件名
}

4.5.modules 的操作=======>用于vuex文件的分离。便于维护

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿
所以:Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割

命名空间
    可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名

    若需要在全局命名空间内分发 action 或提交 mutation,将 { root: true } 作为第三参数传给 dispatch 或 commit 即可

1.引入单文件

2.在modules中注册单文件

11.png

在单文件中写入相关代码

12.png

访问单文件的state中的值:分离文件后的方法

//文件名:分离出来的文件的名。

//数据名:state里面的键

$store.state.文件名.数据名

访问单文件的的方法:直接访问,vuex会自动的进行查找,所以在方法命名时不能重复

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352