vue3.0 子组件修改父组件传递过来的值

12 篇文章 3 订阅
12 篇文章 0 订阅

第一种解决方法

vue 的子组件 不是 不能直接更改父组件的值,需要将props 的值 给到子组件,后再修改,

否则:Unexpected mutation of “props” prop.

vue3提供了一个解决:toRefs:https://v3.cn.vuejs.org/api/refs-api.html#torefs

toRefs 非常有用,这样消费组件就可以在不丢失响应性的情况下对返回的对象进行解构/展开

使用

const { foo, bar } = reactive({
    foo: 1,
    bar: 2
})

// 核心解决, 使用reactive接收不会响应时更新,需要使用toRefs
const props = defineProps({
    drawerStatus: {
        type: Boolean
    }
})
const {drawerStatus} = toRefs(props)

使用toRefs进行解决

<template>
    <el-drawer v-model="drawerStatus" title="设置部门助理" :before-close="handleClose">
        <div class="drawer-footer">
            <el-button>取消</el-button>
            <el-button type="primary" @click="onSubmit">确定</el-button>
        </div>
    </el-drawer>
    
</template>


<script setup>
import {reactive, toRefs} from 'vue'

const props = defineProps({
    drawerStatus: {
        type: Boolean
    }
})

const emits = defineEmits(['upDrawerStatus'])


const {drawerStatus} = toRefs(props)

console.log(33333333, drawerStatus)

// 新增角色数据
const formData = reactive({
})

const onSubmit = () => {
    handleClose()
}
const handleClose = () => {
    console.log('关闭抽屉')
    emits('upDrawerStatus', false)
}
</script>

优化版

vue3.0 子组件修改父组件传递过来的值优化vue3 Unexpected mutation of “childFormData” prop

超级简单版,父组件只要传入el-form的对象,子组件接收父组件的props既可完成

父组件

父组件将 form表单的 popFormData传递给子组件

<!--el-form 父组件-->
<el-form
         ref="ruleForm"
         label-position="top"
         label-width="110px"
         :model="popFormData"
         :rules="rules"
         style="padding: 20px"
         > 
    		<!--封装的子组件-->
			<business-module :child-form-data="popFormData" />
</el-form>

子组件

子组件定义一个 viewsData 对象接收父组件传过来的值:formData: props.childFormData,然后el-select中使用即可;

示例中的@change=“chooseBusinessHandle” 选择后为父组件添加值或者修改值并不会报错:(vue3 Unexpected mutation of “childFormData” prop vue3“childFormData”属性意外突变)

如果还想为子组件添加验证:为子组件添加 prop 属性和 rules 属性即可。

<template>
  <el-form-item
    label="业务模块"
    :prop="'formData.' + '.businessModule'"
    :rules="{
      required: true,
      message: '请选择业务模块',
      trigger: ['blur', 'change'],
    }"
  >
    <el-select
      v-model="formData.businessModule"
      class="filter"
      clearable
      filterable
      @change="chooseBusinessHandle"
    >
      <el-option
        v-for="item in businessList"
        :key="item.id"
        :label="item.businessName"
        :value="item.id"
      />
    </el-select>
    {{ formData }}
  </el-form-item>
</template>

<script>
  import { reactive, toRefs } from 'vue'
  export default defineComponent({
    props: {
      childFormData: {
        type: Object,
        default() {
          return {}
        },
      },
    },
    setup(props) {
      // 视图数据
      const viewsData = reactive({
        formData: props.childFormData,
      })

      /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

      /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
      // 视图操作
      const viewsOperate = {
        chooseBusinessHandle() {
          viewsData.formData.companyShortName = 666
        },
      }

      return {
        ...toRefs(viewsData), // 视图数据
        ...toRefs(viewsOperate), //视图操作
      }
    },
  })
</script>

<style lang="scss" scoped>
  .filter {
    width: 100%;
  }
</style>

效果

父组件点击确认的时候子组件也会跟着验证(实现),不需要通过emit告诉父组件去验证了

在这里插入图片描述

子组件值改变的时候 子组件会修改父组件传递过来的值,提示代码也看到了值的变动

在这里插入图片描述

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 3中,组件修改组件,可以通过两种方式实现。第一种是使用props将组件传递组件,并在组件中通过$emit触发事件来修改组件。第二种是使用provide和inject属性在组件中提供数据,在组件中通过inject来获取并修改组件。 对于第一种方法,你可以在组件中将需要修改作为props传递组件。然后在组件中通过$emit触发一个自定义事件,并将修改后的作为参数传递组件组件监听组件触发的事件,并在事件处理函数中更新自己的。 对于第二种方法,你可以在组件中使用provide来提供需要修改。然后在组件中使用inject来获取并修改组件。通过修改组件中的组件也会随之更新。 请注意,在使用以上两种方法时,需要确保在组件修改组件时遵循Vue的响应式原理,即使用Vue提供的方法来修改,而不是直接对属性进行赋操作。 举个例,假设你的组件名为ChildComponent,组件传递为parentValue,你可以按照以下步骤来修改组件: 1. 在组件中将parentValue作为props传递组件: ```html <ChildComponent :child-value="parentValue" /> ``` 2. 在组件中接收props,并在需要修改的地方使用$emit触发事件: ```javascript export default { props: ['childValue'], methods: { updateParentValue(newValue) { this.$emit('update:value', newValue); } } } ``` 3. 在组件中监听组件触发的事件,并在事件处理函数中更新自己的: ```html <ChildComponent :child-value="parentValue" @update:value="parentValue = $event" /> ``` 另外,在Vue 3中还可以使用v-model指令来简化以上操作: 1. 在组件中使用v-model指令绑定组件: ```html <ChildComponent v-model="parentValue" /> ``` 2. 在组件中接收value属性,并在需要修改的地方使用this.$emit('update:value', newValue)来触发事件: ```javascript export default { props: ['value'], methods: { updateValue(newValue) { this.$emit('update:value', newValue); } } } ``` 通过以上方法,你可以在Vue 3中实现组件修改组件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue中如何让组件修改组件数据](https://download.csdn.net/download/weixin_38517113/12758427)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue3.0 组件修改组件传递过来](https://blog.csdn.net/qq_25286361/article/details/122534887)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值