Vue:父子组件如何利用props和$emit通信

父组件向子组件传值——利用props

  • 子组件怎么接收?
    通过子组件内部的props接收父组件传递过来的值,可以在模板中使用
    注意:如果props使用驼峰式命名,则父组件传值的属性需使用短横线。因为HTML 中的 attribute 名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。
<template>
  <div>{{msg}}:{{title}}</div> 
</template>

<script>
export default {
	//props接收父组件传递过来的值
    props: ['title'],
    data () {
        return {
            msg: '子组件'
        }
    }
}
</script>
  • 父组件怎么传值?
    父组件通过属性传值给子组件(可动态绑定属性)
    注意:属性不能用驼峰式命名,可以用短横线方式命名。
<template>
  <div>
      {{msg}}
      <!-- 父组件通过动态绑定属性传值给子组件 -->
      <B :title="title"></B>
  </div>
</template>

<script>
import B from './B.vue'
export default {
    data () {
        return {
            msg: '父组件',
            title: '父组件传值的内容'
        }
    },
    components: {
        B
    }
}
</script>

props传递数据原则:单向数据流

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。防止从子组件意外变更父级组件的状态。

子组件向父组件传值——利用$emit

关于$emit

$emit ( ‘自定义事件名’,‘附加参数’ ):触发当前事件。

触发当前实例上的事件,附加参数都会传给监听器回调。 触发的事件名需要完全匹配监听这个事件所用的名称.

注意:推荐始终使用驼峰式的事件名

  • 子组件如何向父组件传值?
    子组件通过自定义事件向父组件传值
<template>
    <div>
        <p>{{msg}}</p>
        <button @click="$emit('enlarge-text', 5)">扩大父组件中的字体大小</button>
    </div> 
</template>
  • 父组件如何处理并接收值?
    父组件监听子组件的事件,并通过$event接收信息
<template>
  <div>
      <div :style="{fontSize: fontSize + 'px'}">{{msg}}</div>
      <!-- 父组件监听子组件的事件,并通过$event接收信息 -->
      <B @enlarge-text="handle($event)"></B>
  </div>
</template>

<script>
import B from './B.vue'
export default {
    data () {
        return {
            msg: '父组件',
            title: '父组件传值的内容',
            fontSize: 10
        }
    },
    methods: {
        handle(val) {
            // 扩大字体大小
            this.fontSize += val
        }
    },
    components: {
        B
    }
}
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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` 事件,并传递了新的消息给父组件。 这样,组件组件之间就实现了双向的数据传递和通信

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值