【发布时间】:2026-02-20 19:40:01
【问题描述】:
如果 am 通过 components props 将对象传递给子组件,这个对象是被克隆还是只是传递对原始对象的引用?
例如,在我的App.js 中,我正在导入一个 JSON 对象 ENTRY_DATA。然后我通过道具将该对象传递给我的子组件(或者在这种情况下,路由)。这样做是在节省内存,还是与在每个组件上导入 ENTRY_DATA 一样?
import React, { Component } from 'react';
import { withRouter, Route } from 'react-router-dom'
import ENTRY_DATA from './../../entry_data.json';
import Register from '../Register/Register';
import Categories from '../Categories/Categories';
import Category from '../Category/Category';
import Entry from '../Entry/Entry';
class App extends Component {
render() {
return (
<div className="app" >
<main>
<Route exact path="/" component={Register} />
<Route exact path='/categories' render={(props) => (
<Categories {...props} categories={ENTRY_DATA} />
)}/>
<Route exact path='/categories/:category' render={(props) => (
<Category {...props} categories={ENTRY_DATA} />
)}/>
<Route exact path='/categories/:category/:entry' render={(props) => (
<Entry {...props} categories={ENTRY_DATA} />
)}/>
</main>
</div>
);
}
}
export default withRouter(App);
如果ENTRY_DATA 是 5kb,并且我将它传递给 3 个不同的组件,这是否意味着我最终得到了 20kb 的 ENTRY_DATA 或者它们都引用了一个 5kb ENTRY_DATA?
【问题讨论】:
-
参考。这使得它可能是可变的。
-
@DimitarChristoff 你有任何消息来源可以证实这一点吗?你说可能是可变的。你的意思是因为理论上它可能会发生变异,但因为 react 使得
this.props是只读的? -
可能是this的副本
-
它可能是可变的,因为它会被转换为您的目标 - 拥有不可写的对象取决于属性描述符和 polyfills 的实现(在旧 IE 中也是可能的)。但如果您传递的是 JSON 结构(又名对象),您的组件可能会覆盖结构深处的对象值并导致副作用。你应该考虑 Immutable.js 或类似的。
-
是的,如果它是一个对象,它会传递引用。
标签: javascript reactjs