当前位置: 首页 > 知识库问答 >
问题:

javascript - vue3在父组件中直接传递props响应式对象给子组件,为什么子组件可以修改值?

羊舌旭尧
2023-08-18
<template>  <div ref="root" class="homse">    <!-- {{ refTreeData }} -->    <recursiveCom :tree-data="refTreeData"></recursiveCom>  </div></template><script setup lang="ts">import type { nodeType } from './type'import { ref, reactive } from 'vue'// 测试 tree 型组件import recursiveCom from './recursiveCom.vue'let treeDataTest = [  {    title: '节点名称',    id: '1',    status: '未开始',    start_time: '2023.08.10',    end_time: '2023.08.16',    falg: true,    show: true,    children: [      {        title: '子节点名称',        id: '1 - 1',        status: '进行中',        start_time: '2023.08.10',        end_time: '2023.08.16',        show: true,        children: [          {            title: '子节点名称',            id: '1 - 1 - 1',            status: '进行中',            start_time: '2023.08.10',            end_time: '2023.08.16'          },          {            title: '二子节点名称',            id: '1 - 2 - 2',            status: '已完成',            start_time: '2023.08.10',            end_time: '2023.08.16'          }        ]      },      {        title: '二子节点名称',        id: '1 - 2',        status: '已完成',        start_time: '2023.08.10',        end_time: '2023.08.16'      }    ]  },  {    title: '节点名称',    id: '2',    status: '未开始',    start_time: '2023.08.10',    end_time: '2023.08.16',    falg: true,    show: true,    children: [      {        title: '子节点名称',        id: '2 - 1',        status: '进行中',        start_time: '2023.08.10',        end_time: '2023.08.16'      },      {        title: '二子节点名称',        id: '2 - 2',        status: '已完成',        start_time: '2023.08.10',        end_time: '2023.08.16'      }    ]  }]let refTreeData = ref<nodeType[]>(treeDataTest)</script><style scoped></style>

子组件

<template>  <div style="border: 1px solid #ccc; margin: 10px">    <div v-for="node in treeData" :key="node.id">      <span        v-if="node.children"        class="icon"        :class="node.show ? 'packup' : 'openup'"        @click="expansion(node)"        >��</span      >      <div class="continer">{{ node.id }}{{ node.title }} {{ node.status }}</div>      {{ node.show }}      <template v-if="node.show">        <recursive-node v-if="node.children" :tree-data="node.children" />      </template>    </div>  </div></template><script setup lang="ts">import type { nodeType } from './type'import recursiveNode from './recursiveCom.vue'defineProps<{  treeData: nodeType[]}>()let expansion = (node: nodeType) => {  node.show = !node.show}</script><style scoped lang="less">.packup {  transform: rotate(180deg);}.openup {  transform: rotate(90deg);}.icon {  display: inline-block;  cursor: pointer;}.continer {  display: inline-block;}</style>

在expansion函数中可以直接修改父组件的值,vue也不会报警告,这是被允许的吗?为什么可以正常修改

共有1个答案

况承福
2023-08-18

https://cn.vuejs.org/guide/components/props.html#one-way-data...

对象或数组作为 props 被传入时,虽然子组件无法更改 props 绑定,但仍然可以更改对象或数组内部的值。这是因为 JavaScript 的对象和数组是按引用传递,而对 Vue 来说,禁止这样的改动,虽然可能生效,但有很大的性能损耗,比较得不偿失。

 类似资料:
  • 问题描述 编写树形结构组件碰到的问题。父组件传递的数据是没有控制样式的这些属性的。子组件在接受数据后增加了一些控制样式的属性。但是在修改这些增加的属性时控制台报错。 相关代码 父组件 子组件 控制台报错 问题出现的环境背景及自己尝试过哪些方法 这个属性可以在控制台打印出来,但是修改的时候却又找不到了。

  • vue3中子组件向父组件传值 在传值的时候为什么只能在声明一个方法的时候传递,而不能在定义click的时候传递呢

  • 场景 我有一个父组件,里面包含一个子组件,子组件传入了一个对象,假设对象是字面量。当我的父组件更新时,子组件也会更新。导致不必要的渲染。 尝试 1.通过使用React.memo包裹子组件,作用是父组件更新,子组件只有当props变化才变化。结果发现还是不对。。。。分析了一下原因是,当父组件更新时候,传入到子组件的的引用发生了变化,虽然值是相同的。。。咋搞

  • 父组件动态传递ref给子组件应该怎么写? 父组件调用 子组件 这里我想把父组件传递的ccc动态给子组件,然后操作子组件?

  • Vue3 子组件中利用父组件传递过来的值,这么写对吗? 这里options是父组件传递过来的,子组件中使用了options中的属性,这里直接在setup中返回是可以动态绑定的吗,还是要通过computed或reactive包一下再返回?

  • 我是新来的,对一些事情有点困惑。我在网上读了许多文章,声称组件不能改变自己的道具,但是父组件可以改变其子组件的道具。然而,我没有看到任何真正展示如何做到这一点的东西。 我希望能够做到这一点: 然而,我根本不知道如何做到这一点——尽管我在React上读到的几乎所有材料都说父母可以改变孩子的道具。我能正常工作的如下: 当我只想重新渲染子视图时,父视图需要重新渲染,这对我来说似乎有点过分了。如何更改<代