vue3 修改父组件prop的值

更新于 2023-09-06 15:15 230
专栏: 前端文章 标签: vue

实现方式

  1. 父组件传参的时候需要增加v-model

    1. <AiAppletModal v-model:show="show" :ai-applet-id="id" />
  2. 子组件内增加更新值得事件并在需要修改的时候调用

  1. const emit = defineEmits<{
  2. (e: 'update:show', visible: boolean): void // 定义修改父组件(prop内)的值的事件
  3. }>()
  4. const showModal = computed({
  5. get: () => props.show,
  6. set: (show: boolean) => {
  7. emit('update:show', show)
  8. },
  9. })

示例代码

子组件代码:

  1. <script lang="ts" setup>
  2. import { computed } from 'vue'
  3. import { AiAppletEdit } from '@/components/common'
  4. const props = defineProps<{
  5. show: boolean
  6. }>()
  7. const emit = defineEmits<{
  8. (e: 'update:show', visible: boolean): void // 定义修改父组件(prop内)的值的事件
  9. }>()
  10. // 更新值父组件传来的值
  11. const showModal = computed({
  12. get: () => props.show,
  13. set: (show: boolean) => {
  14. emit('update:show', show)
  15. },
  16. })
  17. // watch(show, (newValue, oldValue) => {
  18. // if (newValue === true)
  19. // getSystemList()
  20. // })
  21. </script>
  22. <template>
  23. <NButton @click="showModal = true">
  24. 来吧
  25. </NButton>
  26. <NModal v-model:show="showModal">
  27. <NCard
  28. style="width: 600px"
  29. title="模态框"
  30. :bordered="false"
  31. size="huge"
  32. role="dialog"
  33. aria-modal="true"
  34. >
  35. <template #headerExtra>
  36. 噢!
  37. </template>
  38. <AiAppletEdit />
  39. <template #footer>
  40. 尾部
  41. </template>
  42. </NCard>
  43. </NModal>
  44. </template>

父组件调用代码:

  1. <script setup lang='ts'>
  2. import { ref } from 'vue'
  3. import { AiAppletModal } from '../../components/'
  4. // import { AiAppletEdit } from '@/components/common'
  5. const id = ref<number | undefined>()
  6. const show = ref<boolean>(false)
  7. function open(appletId: number | undefined) {
  8. show.value = true
  9. id.value = appletId
  10. console.log('查看', appletId)
  11. }
  12. </script>
  13. <template>
  14. <div>
  15. <!-- 代码内容 -->
  16. <!-- 可改变的参数一定要加 v-model -->
  17. <AiAppletModal v-model:show="show" :ai-applet-id="id" />
  18. <button @click="open(1)">
  19. 打开1
  20. </button> |
  21. <button @click="open(undefined)">
  22. 打开undefined
  23. </button> |
  24. <button @click="open(2)">
  25. 打开2
  26. </button>
  27. </div>
  28. </template>
  29. <style>
  30. html,body{
  31. padding: 20px;
  32. background-color: beige;
  33. }
  34. </style>