组件间传值

父传子

父组件:

vue
12345678910111213
<template>
  <div style="background-color: lightcoral;">
    我是父组件
    <!-- 将要传给子组件的值重新命个名加上:即可 -->
    <Children :name = "fatherName"></Children>
  </div>

</template>

<script setup>
import Children from './components/children.vue'
const fatherName = 'Cain'
</script>

子组件:

vue
123456789101112131415
<template>
  我是子组件
  父亲的名字是:{{ props.name }}
</template>

<script setup>
// 接收父组件传过来的值
const props = defineProps({
  name: {
    type: String,
    default: '默认值'
  }
})
</script>

子传父

子组件:

vue
12345678910111213
<template>
  我是子组件
  <button @click="send">发送</button>
</template>

<script setup>
// 定义子组件传值
const emit = defineEmits(['update:childrenName'])
const send = () => {
    // 传值给父组件
  emit('update:childrenName', '这里是子组件传过来的值1', '这里是子组件传过来的值2')
}
</script>

父组件:

vue
123456789101112131415161718
<template>
  <div >
    我是父组件
    <!-- 通过事件的方式接收子组件传过来的值 事件名要与子组件中定义的相同-->
     <!-- 需要使用一个函数来接收,因为子组件的值是放到参数中的-->
    <Children @update:children-name="getChildrenName"></Children>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import Children from './components/children.vue'
const childrenName = ref('')
// 定义接收子组件传值的方法
const getChildrenName = (name1, name2) => {
  console.log(name1, name2)
}
</script>

子组件参数暴露

子组件:

vue
12345678910111213
<template>
  我是子组件
</template>

<script setup>
// 使用 defineExpose 向父组件暴露方法或属性
defineExpose({
  send() {
    console.log('子组件发送消息')
  },
  name: '子组件名称'
})
</script>

父组件:

vue
12345678910111213141516171819
<template>
  <div >
    我是父组件
    <!-- 使用ref绑定一下子组件的实例 -->
    <Children ref="children"></Children>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import Children from './components/children.vue'
const children = ref('')
import { onMounted } from 'vue'
onMounted(() => {
  // 通过ref访问子组件暴露的方法
  children.value?.send()
  console.log(children.value?.name) // 访问子组件暴露的属性
})
</script>

这样拿到的子组件参数不能直接修改