vue父子组件传值,props,this.$emit,ref

1. 父子组件传值 ,只涉及普通属性和展示。

解释例子:A.vue 作为子组件,B.vue作为父组件。他们的所处深度一样,即在同一个文件夹下。

  • 父组件中需要进行的操作:

    1. 在父组件中引入子组件,如 import comA from "./A.vue"
    2. 在父组件中注册刚刚引入的子组件,如:components:{comA}
    3. 使用子组件的地方,绑定需要从父组件传递给子组件的属性值:
      <com-a :title="msg"></com-a>, 其中,msg是父组件中需要传递给子组件的内容(假设为“哈哈哈”),定义在data中,title则是传递给子组件的属性名,在子组件中需要接收;即父组件中,引入、注册并使用了子组件,并给子组件A.vue传了一个值,其中这个值的名字是title,内容是: “哈哈哈”;
  • 子组件接收父组件传值的方式:

    1. 直接接收: props:[ "title" ] , props是一个数组,数组里面的每一个元素是父组件传递过来的属性名,接收后可以当data中定义的属性一样直接使用,<div>{{title}}</div>
    2. 接收的时候验证: props:{ "title":{type:String}} ,这是另一种接收方式, 此时,props是一个对象,它里面的每一个属性都是从父组件传过来的属性名,这里的title就是属性名,这里的type则是该属性值的类型,强调传递的值应该是String类型,它会进行验证,若不是String,会有相应报错。这里还可以设置title的默认值,写法:props:{"title":{ type:String,default:"嘿嘿" } }
      可以传数据(绑定属性)和方法
  • 父组件 B.vue( //*** 后 是我写的注释)

<template>
    <div>
        <h3 style="color:red;">我是父组件的</h3>
        <com-a :title="msg"></com-a>     // *** 使用子组件,并传入title
    </div>
</template>
<script>
import comA from './A.vue'   //***引入子组件A.vue
export default {
  components: { //*** 注册子组件 
    comA
  },
  data () {
    return {
      msg: '哈哈哈'
    }
  }
}
</script>
  • 子组件A.vue
<template>
    <div>
        <h3>我是子组件的</h3>
        {{title}} //*** 使用props接收的值
    </div>
</template>
<script>
export default {
  props: ['title'] //*** 接收父组件传递过来的值
}
</script>

效果如图:,其余可自行验证。
在这里插入图片描述

2. 父子组件传值 ,有相应的操作,和方法有关 ( 可看做 ,子组件给父组件传值)

解释例子:A.vue 作为子组件,B.vue作为父组件。他们的所处深度一样,即在同一个文件夹下。

  • 父组件中需要进行的操作:
    1. 在父组件中引入、注册、使用子组件以及传属性值不再细说
    2. 在使用子组件的时候,用v-on (@也可)绑定一个方法名,值也是一个方法:
      如:<com-a @changeTitleVal="changeTitleVal"></com-a>
      这里@后的changeTitleVal是传递给子组件的方法名,引号中的changeTitleVal,则是在父组件中定义的方法。它俩的名字可相同也可不同。
    3. 在methods中定义一个方法,名为changeTitleVal,如:
changeTitleVal(item){ //*** 这里有没有形参item,取决于子组件是否在使用该方法的时候给父组件传回了值,如果传了值,则这里需定义这个接收的形参item,反之则不需要。
	console.log("data:",item)
}
  • 子组件中:
    1. this.$emit触发自定义事件,执行父组件定义的changeTitleVal方法,并给父组件传值:
      如: this.$emit('changeTitleVal', " 我是传回去的item值 " ) ,括号中的前一个参数,是刚刚父组件中定义的方法名,第二个参数是要传的值。
  • 例,需求
    需要在子组件A.vue中,点击一个按钮,然后后将A.vue在data中定义的info值传递给父组件B.vue,并将该info的值赋给B中data中定义的msg 。
  • 父组件 B.vue( //*** 后 是我写的注释)
<template>
   <div>
       <h3 style="color:red;">我是父组件的</h3>
       <com-a :title="msg" @changeTitleVal="changeTitleVal"></com-a>
   </div>
</template>
<script>
import comA from './A.vue'
export default {
 components: {
   comA
 },
 data () {
   return {
     msg: '沧海一声笑'
   }
 },
 methods: {
   changeTitleVal (data) {
     this.msg = data
   }
 }
}
</script>
  • 子组件A.vue
<template>
    <div>
        <h3>我是子组件的</h3>
        <div>{{title}}</div> 
        <el-button @click="changeText">点击它,info的值传给父组件</el-button>
    </div>
</template>
<script>
export default {
  props: ['title'],
  data () {
    return {
      info: '滔滔两岸潮'
    }
  },
  methods: {
    changeText () {
      this.$emit('changeTitleVal', this.info) 
    }
  }
}
</script>

点击按钮之前:
在这里插入图片描述
点击按钮之后:
在这里插入图片描述

3. 父组件主动获取子组件的数据和方法:

父组件主动获取子组件的数据和方法:

  • 在调用子组件的时候,给子组件v-son定义一个ref,为son
   <v-son ref="son"></v-son>
  • 在父组件里面通过:
    this.$refs.son.方法this.$refs.son.属性获取; son是ref的值,随取
  • 例:父组件 fatherComp.vue:
<template>
  <div class="father_bg">
    <son ref="son"></son>
    <h3><button @click="run">父组件主动获取子组件的数据***********{{msg}}</button></h3>
  </div>
</template>
<script>
import son from './sonComp.vue'
export default {
  name: 'father1',
  components: {
    son
  },
  data () {
    return {
      msg: ''
    }
  },
  methods: {
    run () {
      this.msg = this.$refs.son.msg
    }
  }
}
</script>
  • 例:子组件 sonComp.vue:
<template>
  <div class="son_bg">
   <h3>子组件</h3>
  </div>
</template>
<script>
export default {
  name: 'son',
  data () {
    return {
      msg: '这是子组件的数据'
    }
  },
  methods: {

  }
}
</script>

效果图:

4. 子组件主动获取父组件的数据和方法

在子组件内部直接:this.$parent.数据 、 this.$parent.方法

  • 例:父组件 fatherComp.vue:
<template>
  <div class="father_bg">
    <son ></son>
    <h3><button @click="run">run</button></h3>
  </div>
</template>
<script>
import son from './sonComp.vue'
export default {
  name: 'father1',
  components: {
    son
  },
  data () {
    return {
      msg: '这是父组件的数据'
    }
  },
  methods: {
    run () {
      alert('这是父组件的run方法')
    }

  }
}
</script>
  • 例:子组件 sonComp.vue:
<template>
  <div class="son_bg">
    <h3> <button @click="getFdata"> 这是子组件,主动获取父组件的数据和方法*****{{m}}</button> </h3>
  </div>
</template>
<script>
export default {
  name: 'son',
  data () {
    return {
      m: ''
    }
  },
  methods: {
    getFdata () {
      this.m = this.$parent.msg
      this.$parent.run()
    }
  }
}
</script>

效果图:在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 中,父子组件之间的通信可以通过 props 和 emit 进行。下面是一个使用组合式代码的示例: 父组件: ```vue <template> <div> <h1>父组件</h1> <ChildComponent :message="message" @update-message="updateMessage" /> </div> </template> <script> import { ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent, }, setup() { const message = ref('Hello from parent'); const updateMessage = (newMessage) => { message.value = newMessage; }; return { message, updateMessage, }; }, }; </script> ``` 子组件: ```vue <template> <div> <h2>子组件</h2> <p>{{ message }}</p> <button @click="sendMessage">发送消息给父组件</button> </div> </template> <script> import { defineEmit, defineProps } from 'vue'; export default { emits: ['update-message'], setup(props) { const message = defineProps({ type: String, default: props.message, }); const sendMessage = () => { const newMessage = 'Hello from child'; emit('update-message', newMessage); }; return { message, sendMessage, }; }, }; </script> ``` 在父组件中,我们通过 `:message="message"` 将父组件的 `message` 数据传递给子组件。子组件通过 `defineProps` 定义了一个名为 `message` 的 prop,它的默认值为父组件传递过来的 `message` 数据。 在子组件中,我们通过 `@update-message="updateMessage"` 监听子组件触发的 `update-message` 事件,并在父组件中定义了 `updateMessage` 方法来处理事件。当子组件中的按钮被点击时,会触发 `sendMessage` 方法,该方法通过 `emit` 发射了一个 `update-message` 事件,并传递了新的消息给父组件。 这样,父组件和子组件之间就实现了双向的数据传递和通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值