VUE中组件通信

VUE中组件通信

1.使用props
2.自定义事件
3.PubSub发布订阅
4.vuex(重点)

注意点:
1.不要通过子组件来改变父组件的状态数据(应该告诉父组件,让父组件自己改)
2.数据和处理数据的函数应该在同一模板内(父组件的数据要修改,方法等要绑定在父组件中,然后再传给子组件才合理)

第一种方法props的使用:
(1).在子组件中添加props插件

<script>
    export default {
        name: "PropsComponent",
        props:['name','age']
    }
</script>

(2).在子组件中直接使用已经定好的值

<template>
    <div>
        <h4>姓名:{{name}}</h4>
        <h4>年龄:{{age}}</h4>
    </div>
</template>

(3).在父组件中声明值的内容,相当于赋值

<PropsComponent name="ls" age="18"></PropsComponent>

这样普通的定义和接受有缺陷,无法限制传进来的值的类型

修改:

//子组件中先定义好接受数据的类型,可以是对象,数组,方法,字符串等
<script>
    export default {
        name: "PropsComponent",
        props:{
            // 数值类型, 是否一定要求,默认值
            name:{type:String , require:true , default:'www'},
            age:Number,
            person:Object,
            logPerson:Function,
        }
    }
</script>

(4).子组件在定义值得时候要动态绑定,其他使用都一样,绑定方法

<template>
    <div>
        <h4>姓名:{{name}}</h4>
        <h4>年龄:{{age}}</h4>
        <h4>{{person}}</h4>
        <button @click="logPerson('zl',18)">点击输出</button>
    </div>
</template>

(5).父组件将定义好的值和方法传入(计算父组件的值和方法,都定义再父组件中)

<PropsComponent name="ls" :age=18 :person="p" :log-person="logPerson"></PropsComponent>

,
      methods:{
          logPerson(name ,age ){
              alert(`${name} ${age}`)
          }
      }

第二种方法:自定义事件传递参数
局限和props一样,使用更麻烦一些

(1).在子标签中定义一个方法

<button @click="btnClick"></button>

(2).告诉父组件,点击了按钮 通过$emit

methods:{
            btnClick(){
                this.$emit('btnClick',{name:'name',age:18})
            }
        }

(3).在父组件中接受绑定,并且自己定义方法
//CustomEvents为子组件名字

<CustomEvents @btnClick="del"></CustomEvents>

(4).要被修改的p标签定义

  <p ref="word" class="word">要被删除</p>

(5).执行父组件自己定义的del方法

 del(args){
              console.log(args),
                  this.$refs.word.remove();
          }

第三种方法:PubSub发布订阅
安装pubsub

npm install --sava pubsub-js

在要使用的父子组件中都import添加
这种方式,父亲订阅,儿子发布

在子组件的删除方法下添加(删除方法由Button点击监听)

//子组件的button中有一个点击事件delBtn
<button v-show="isShowButton" class="btn btn-warning" @click="delBtn">删除</button>
//在子组件中methods实现方法delBtn()同时,发布一个 PubSub.publish给父组件订阅
        methods:{
            delBtn(){
                if(window.confirm(`你确定删除任务吗${this.todo.title}吗?`)){
                    // this.delTodo(this.index)
                    //发布消息给父组件
                    PubSub.publish('delTodo',this.index)
                }
            }
        }

在父组件mounted中添加

  mounted() {
    //订阅消息(delTodo)
      PubSub.subscribe('delTodo',(msg,token)=>{
      console.log(msg, token);//msg指的是订阅的名字,token指的是传过来的参数
      this.delTodo(token);
    })
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值