简体   繁体   English

如何在反应中合并传递道具和默认道具?

[英]How to merge passing prop and default prop in react?

In my simple create-react-app在我简单的create-react-app

I have this incoming prop我有这个传入的道具

dummyConfig: {
    prop_1: {
      prop_1_1: "100",
      prop_1_2: "100"
    }
  }

in my app's default prop, I have在我的应用程序的默认道具中,我有

dummyConfig: {
    prop_1: {
      prop_1_1: "prop_1_1",
      prop_1_2: "prop_1_2"
    },
    prop_2: {
      prop_2_1: "prop_2_1",
      prop_2_2: "prop_2_2"
    }
  }

I want to have a final prop in App.js to become following, so I can use it.我想在 App.js 中有一个最终道具成为关注对象,以便我可以使用它。

final

dummyConfig: {
    prop_1: {
      prop_1_1: "100",
      prop_1_2: "100"
    },
    prop_2: {
      prop_2_1: "prop_2_1",
      prop_2_2: "prop_2_2"
    }
  }

github link github链接

index.js索引.js

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import * as serviceWorker from "./serviceWorker";

const dummyConfig = {
  prop_1: {
    prop_1_1: "100",
    prop_1_2: "100"
  }
};

ReactDOM.render(
  <React.StrictMode>
    <App
      // sys
      systemConfig={{ systemConfig: "systemConfig" }}
      // app
      applicationConfig={{ applicationConfig: "applicationConfig" }}
      // dummy
      dummyConfig={dummyConfig}
    />
  </React.StrictMode>,
  document.getElementById("root")
);

serviceWorker.unregister();

App.js应用程序.js

import React from "react";
import PropTypes from "prop-types";

function App(props) {
  //test
  console.log("props", props);

  return <div className="App"></div>;
}

App.defaultProps = {
  systemConfig: {},
  applicationConfig: {},
  dummyConfig: {
    prop_1: {
      prop_1_1: "prop_1_1",
      prop_1_2: "prop_1_2"
    },
    prop_2: {
      prop_2_1: "prop_2_1",
      prop_2_2: "prop_2_2"
    }
  }
};

App.propTypes = {
  systemConfig: PropTypes.object.isRequired,
  applicationConfig: PropTypes.object.isRequired
};

export default App;

When I do console.log I only see.当我执行 console.log 时,我只能看到。 Any way to achieve with using prop and default prop?有什么办法可以通过使用 prop 和 default prop 来实现?

{
  "systemConfig": {
    "systemConfig": "systemConfig"
  },
  "applicationConfig": {
    "applicationConfig": "applicationConfig"
  },
  "dummyConfig": {
    "prop_1": {
      "prop_1_1": "100",
      "prop_1_2": "100"
    }
  }
}

Instead of giving App a default props field of dummyConfig , you can have a "default value" for dummyConfig as a variable inside of your function.而不是给App的默认道具场dummyConfig ,你可以有一个“默认值”为dummyConfig作为函数的变量里面。

For example:例如:

function App(props) {
  //test
  const dummyConfig = {
    prop_1: {
      prop_1_1: "prop_1_1",
      prop_1_2: "prop_1_2"
    },
    prop_2: {
      prop_2_1: "prop_2_1",
      prop_2_2: "prop_2_2"
    },
    ...props.dummyConfig
  }
  // dummyConfig will now be a merge with your props, and "default value"

  return <div className="App"></div>;
}

App.defaultProps = {
  systemConfig: {},
  applicationConfig: {},
  dummyConfig: {}
};

App.propTypes = {
  systemConfig: PropTypes.object.isRequired,
  applicationConfig: PropTypes.object.isRequired
};

If you want your state to change based on the props that are passed in, you could do something like:如果您希望根据传入的道具更改状态,您可以执行以下操作:

const defaultDummyConfig = {
  prop_1: {
    prop_1_1: "prop_1_1",
    prop_1_2: "prop_1_2"
  },
  prop_2: {
    prop_2_1: "prop_2_1",
    prop_2_2: "prop_2_2"
  },
}

function App(props) {
  //test
  const [ dummyState, setDummyState ] = useState({
    ...defaultDummyConfig,
    ...props.dummyConfig
  });

  // update the new state if the prop ever changes
  // this way, dummyState will always contain what you want (if it's your desired effect)
  useEffect(() => {
    setDummyState({...defaultDummyConfig, props.dummyConfig})
  }, [props.dummyConfig])

  return <div className="App"></div>;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM