vue3 子组件可以修改props的属性值吗? 可以修改

vue3 子组件可以修改props的属性值吗? 可以修改

1.概要

最近做项目的时候,遇到个问题,父组件直接修改子组件的data数据.于是在思考子组件是否可以修改父组件?
答案:可以的,不区分数据类型

2.父调子

//子组件
let items = reactive({
  select: [
    {
      key: 1,
      value: "",
      id: 1, // 必须存在,否则不可拖拽
    },
  ],
});
const getItems = () => {
  return items;
};

const resetItems = () => {
  items.select = [
    {
      key: 1,
      value: "",
      id: 1, // 必须存在,否则不可拖拽
    },
  ];
};

defineExpose({
  getItems,
  resetItems,
  items
});
//父组件 可以通脱refs调用,也可以直接赋值 xAxisFieldRef.value.items.select
xAxisFieldRef.value.getItems.select = data
.filter((x) => x.selectType === 1)
.map((x, index) => {
  return {
    key: index + 1,
    value: x.fieldName,
    id: index + 1,
  };
});

3.子调父

// 父组件
  <props-test
    v-model="model"
    :name="refName"
    :user="retUser"
    :attrs1="retUser"
  ></props-test>
  父组件基础类型{{ model }} 父组件引用类型{{ retUser }}
setup() {
   const state = {
     title: "vue3.0 demo",
   };
   const model = ref("aa");
   const refName = ref(0);
   const retUser = reactive({
     name: "gg",
   });
   return { state, model, refName, retUser };
 },
//子组件
<template>
  <div>
    <button @click="submit">测试基础类型 {{ props.modelValue }}</button>
    <button @click="direct">测试引用类型 {{ props.user }}</button>
  </div>
</template>

<script>
import { defineComponent } from "vue";

export default defineComponent({
  name: "propsTest",
  props: {
    modelValue: String,
    name: String,
    user: Object,
    info: Object,
  },
  emits: ["update:modelValue"],
  setup(props, context) {
    console.log("props-text", props);
    console.log("props-ctx", context);

    // 使用 emit 修改
    const submit = () => {
      //   context.emit("update:modelValue", new Date()); // 基础类型需要使用 emit 来修改
      props.modelValue = new Date(); // 直接手动修改无效
    };

    // 使用 proxy 修改
    const user = props.user; // 可以直接获取,不需要使用 toRef
    const direct = () => {
      user.name = new Date();
    };
    return {
      submit,
      direct,
      props,
    };
  },
});
</script>

4.本质

  • 基本数据类型:副本,不会影响数据的修改
    如何修改?
    context.emit("update:modelValue", new Date()); // 基础类型需要使用 emit 来修改
  • 引用数据类型:地址,会影响数据的修改
    如何修改?
    // 使用 proxy 修改
    const user = props.user; // 可以直接获取,不需要使用 toRef
    const direct = () => {
      user.name = new Date();
    };

5.总结

  • vue是单向数据流,父子组件却可以互相修改,官方不建议子组件修改props属性
  • props属性最终来源于父组件的data属性
  • 本质:区分js类型的差异
  • 基本类型需要用emit触发修改
  • 引用类型可以通过reactive直接修改
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值