vue3.0中父组件与子组件的通信传值props与$emit :VOA模式

父组件传值到子组件

所有的 props 都遵循着单向绑定原则,props 因父组件的更新而变化,自然地将新的状态向下流往子组件,而不会逆向传递(注意:只要父组件传给子子组件的值发生变动,父组件会自动的传给子组件,注意:是自动的传送)。这避免了子组件意外修改父组件的状态的情况,不然应用的数据流将很容易变得混乱而难以理解,
另外,每次父组件更新后,所有的子组件中的 props 都会被更新到最新值,这意味着你不应该在子组件中去更改一个 prop。若你这么做了,Vue 会在控制台上向你抛出警告:(即:父组件传递的参数值子组件只能用,不能修改)

 父组件

<template>
  <div>
    <!-- <ChildModule mytitle="我是标题" aa="张三" bb="李四" v-bind="{ name: '王五', age: 19 }" ></ChildModule> -->
    <!--也可以直接v-bind一个对象-->
    <ChildModule mytitle="我是标题" aa="张三" bb="李四" v-bind="myuser"></ChildModule>
  </div>
</template>
<script>
import ChildModule from "./components/ChildModule.vue" //导入ChildModule组件模板
export default {
  data() {
    return {
      myuser: {
        name: "钱七",
        age: 19
      }
    }
  },
  components: {
    ChildModule: ChildModule //注册局部子组件ChildModule:也可以写成ChildModule:ChildModule
  },
  methods: {

  }
}
</script>

子组件:用props 数组来接收参数

<template>
    <div>
        {{ mytitle }}-- {{ aa }}-- {{ bb }}-- {{ name }}-- {{ age }}
    </div>
</template>
<script>
export default {
    // 用props 数组来接收
    props: ["mytitle", "aa", "bb", "name", "age"]
}
</script>

子组件:用props对象来接收参数

<template>
    <div>
        {{ mytitle }}-- {{ aa }}-- {{ bb }}-- {{ name }}-- {{ age }}--{{ isShow ? "是" : "否" }}
    </div>
</template>
<script>
export default {
    // 用props 数组来接收
    // props: ["mytitle", "aa", "bb", "name", "age", "isShow"]
    props: {
        mytitle: String,
        aa: [String, Number], //表示此参数可以接收String和Number类型
        bb: { //还可以自定义校验参数
            required: true, //true 表示属性必传;false 表示可以不传属性;
            type: String, //表示属性只能是String类型的。也可以指定多个类型如type:[String,Number]
            default() {// 如果该参数没用值则指定一个默认值abc ;也可以直接default: "abc" 
                return "abc"
            },
            //也可以写成:validator:value=>['success','warning','danger','error'].indexOf(value)>-1
            validator(val) {
                //检查参数的值是否是"success"或者"warning"或者"danger"或者"error",如果是则返回true,不是则返回false               
                return ["success", "warning", "danger", "error"].includes(val)
            }
        },
        name: String,
        age: Number,
        isShow: Boolean

    }
}
</script>

下面列举了所有可能的数据类型 

export default {
	props: {
        propA : String,  //字符串类型
        propB : Number,  //数字类型
        propC : Boolean, //布尔值类型
        propD : Array,  //数组类型
        propE : Object, //对象类型
        propF : Date,  //日期类型
        propG: Function, //函数类型
        propH: Symbol, //符号类型
    }
}

子组件传值到父组件

父组件

<template>
  <div>
    <!--在这里添加一个监听事件,这个监听事件的名称可以自己定义,一般用event,当然你也可以叫aaa,如v-on:aaa="handelClick" 主要用于子组件传递参数给父组件-->
    <!-- <ChildModule v-on:event="handelClick"></ChildModule> -->

    <!--在这里添加多个个监听事件,这个监听事件的名称可以自己定义-->
    <ChildModule v-on:event="handelClick" v-on:aaa="handelClick2"></ChildModule>
  </div>
</template>
<script>
import ChildModule from "./components/ChildModule.vue" //导入ChildModule组件模板
export default {
  inheritAttrs:false,
  data() {
    return {
    
    }
  },
  components: {
    ChildModule: ChildModule //注册局部子组件ChildModule:也可以写成ChildModule:ChildModule
  },
  methods: {
    handelClick(user){
      console.log(user);
      console.log(user.name);
      console.log(user.age);
    },
    handelClick2(a,b){
      console.log(a);
      console.log(b);
    }
  }
}
</script>

子组件

<template>
    <div>
        <button v-on:click="handelClick">点击</button>
        <button v-on:click="$emit('event',user)">点击</button><!--我们可以简写成这样,直接调用父组件中的event监听事件,将值传递给父组件,这样就可以不用再定义一个方法了-->
        
        <button v-on:click="handelClick2">点击2</button>
    </div>
</template>
<script>
export default {
  data(){
    return{
        user:{
            name:"张三",
            age:19,
            emial:"abc@123.com"
        }
    }
  },
  methods:{
    handelClick(){
        //$emit的主要作用是子组件可以通过使用$emit,让父组件监听到自定义事件 ,以及传递的参数      
        this.$emit("event",this.user)//调用父组件中的event监听事件,将值传递给父组件(支持传递多个参数,this.$emit("event",this.user,123,456))
    },
    handelClick2(){
        this.$emit("aaa",123,"hello")//调用父组件中的aaa监听事件,将值传递给父组件(支持传递多个参数,this.$emit("aaa",this.user,123,456))
    }
  }
}
</script>

父组件直接从子子组件中获取值$refs

不建议使用会增加组件之间的耦合度,一般用于第三方插件的封装

ref如果绑定在dom节点上,拿到的就是原生dom节点。
ref如果绑定在组件上,拿到的就是组件对象,可以实现通信功能

父组件

<template>
  <div>
    <button v-on:click="handelClick">打印看看</button>
    <ChildModule ref="mychild"></ChildModule>
    <input type="text" ref="myinput">
    <div type="text" ref="mydiv">wowo</div>
  </div>
</template>
<script>
import ChildModule from "./components/ChildModule.vue" //导入ChildModule组件模板
export default {
  inheritAttrs: false,
  data() {
    return {

    }
  },
  components: {
    ChildModule: ChildModule //注册局部子组件ChildModule:也可以写成ChildModule:ChildModule
  },
  methods: {
    handelClick() {
      console.log(this.$.refs.myinput);
      console.log(this.$.refs.mydiv);
      console.log(this.$.refs.mychild);

      this.$.refs.myinput.value="abc";
      this.$.refs.mydiv.style.background='red'; //
      
      this.$refs.mychild.user.name="李四"; //直接获取子组件的user.name值并重新赋值
    }
  }
}
</script>

子组件

<template>
    <div>
       {{user.name}}
    </div>
</template>
<script>
export default {
  data(){
    return{
        user:{
            name:"张三",
            age:19,
            emial:"abc@123.com"
        }
    }
  },
  methods:{
  
  }
}
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,父组件组件的方式有两种: 1. 使用props:在组件中定义props属性,然后在父组件中通过属性的方式将递给组件。例如: 父组件: ```html <template> <div> <child-component :message="message"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { message: 'Hello from parent!' }; } } </script> ``` 组件: ```html <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: ['message'] } </script> ``` 2. 使用$emit:在组件中通过$emit方法触发一个自定义事件,并递需要递的,然后在父组件中通过监听该事件来获取递的。例如: 父组件: ```html <template> <div> <child-component @message-updated="handleMessageUpdated"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { message: '' }; }, methods: { handleMessageUpdated(message) { this.message = message; } } } </script> ``` 组件: ```html <template> <div> <button @click="updateMessage">Update Message</button> </div> </template> <script> export default { methods: { updateMessage() { this.$emit('message-updated', 'Hello from child!'); } } } </script> ``` 组件向父组件的方式也是通过$emit方法触发事件,然后在父组件中通过监听该事件来获取递的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值