javascript - 是通过 Prop 将对象传递给子 react 组件,克隆原始对象还是通过引用传递?

标签 javascript reactjs

如果我要通过 components 属性将对象传递给子组件,这个对象是被克隆还是只是传递对原始对象的引用?

例如,在我的 App.js 中,我正在导入一个 JSON 对象 ENTRY_DATA。然后我通过 Prop 将该对象传递给我的子组件(或在本例中为路由)。我这样做是在节省内存还是与在每个组件上导入 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?

最佳答案

一般来说,这取决于所述 prop 的数据类型。 整数字符串 等基本类型通过其值传递,而对象数据类型(如数组)通过引用传递。

所以是的,对象特别通过引用传递。


演示:

在这个演示中,我们有两个组件,一个父组件和一个子组件。 child 接受两个 Prop ,一个是整数 1,另一个是带有 a: "foo" 的对象。

片刻之后,我们从父级将整数值从 1 更改为 2 并将对象从 a: "foo"a: "bar"。之后,我们从子组件中记录这些 props 的值。
注意:这是一个无状态组件,因此我们没有使用任何类型的状态。我们直接改变值,所以 React 永远不会“知道”这个改变! (ssh,不要告诉 React!)

整数的输出仍然是 1(没有改变 - 按值传递),但是对象的输出是 a: "bar"(改变了! - 通过了通过引用)。

const Parent = () => { 
  let myInt = 1;
  let myObj = {a: "foo"};
  setTimeout(function(){
    myInt = 2;
    myObj.a = "bar";
  }, 500);
 
  return <Child myInt={myInt} myObj={myObj} />;
}

const Child = ({myInt, myObj}) => {
  setTimeout(function(){
    console.log(myInt);
    console.log(myObj);
  }, 1000);
  
  return (
    <div>
      <p>{myInt}</p>
      <p>{JSON.stringify(myObj)}</p>
    </div>
  );
}
 
ReactDOM.render(<Parent />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

关于javascript - 是通过 Prop 将对象传递给子 react 组件,克隆原始对象还是通过引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48210000/

相关文章:

javascript - 打开 Outlook 并使用 HTML/Javascript 预设电子邮件、主题和正文

javascript - 在 Sequelize 中模拟

javascript - 我的 HTML 下拉菜单在 IE6 中不起作用

java - 如何获取完全加载页面的 html(使用 javascript)作为 java 中的输入?

javascript - 使用 Google map 触发标记和标记簇上的点击事件

reactjs - 如何测试渲染 svg 片段的组件?

reactjs - Next 具有固定宽度和自动高度的 JS 图像组件

reactjs - React 未在 Webpack 开发服务器上渲染

javascript - React Native 密码字段切换不起作用

javascript - react JS : Passing values when back button is clicked