javascript - 你如何传递一个包含道具的对象
问题描述
在与状态混为一谈之后,我现在正尝试以一种更能反映最佳实践的方式重组我的应用程序(不确定这是否是这种方式,欢迎提供建议。)
所以,我有我的主页,它包含 3 个状态:查看器、买方、卖方
还有三个不同的组成部分,每个州一个。
我希望能够通过这些组件将道具从主页向下传递给他们的孩子(我读过这是最好的方法??)
主页:
//we have 3 states for the website: viewer,buyside customer, sellside customer
const [visitorType, setVisitorType] = useState('viewer');
if (visitorType == 'viewer') {
return(
<div>
<Viewer visitortype='viewer' setvisitor={()=>setVisitorType()}/>
</div>
)}
else if (visitorType =='buyside') {
return(
<div>
<Buyside visitortype='buyside' setvisitor={()=>setVisitorType()}/>
</div>
)}
else if (visitorType =='sellside') {
return(
<div>
<Sellside visitortype='sellside' setvisitor={()=>setVisitorType()}/>
</div>
)}
};
传递主页道具的最佳方式是什么,以便我可以将它们与孩子道具一起传递给任何孙子?
查看器组件 -UPDATED-:
const MainView = (props) => {
return(
<>
<Navbar mainprops={{props}}/>
</>
)
};
export default MainView
我以前只是单独传递它们,但意识到作为一个对象这样做可能会更好......
更新:点在语法上,但我想知道如何最好地传递对象
导航组件(孙子)
const Navbar = (props) => {
const {mainprops} = props.mainprops;
if (mainprops.visitortype == 'viewer') {
return(
<>
<h1>viewer navbar</h1>
</>
)}
else if (mainprops.visitortype =='buyside') {
return(
<>
<h1>buyside navbar</h1>
</>
)}
else if (mainprops.visitortype =='sellside') {
return(
<>
<h1>sellside navbar</h1>
</>
)}
};
export default Navbar;
更新2 - 这有效,但不确定它是否是正确的方法,这些仍然被认为是对象文字吗?
查看器组件:
const MainView = (props) => {
const mainprops = {...props}
return(
<>
<Navbar mainprops={mainprops}/>
</>
)
};
export default MainView
导航栏组件
const Navbar = (props) => {
const mainprops = {...props.mainprops};
if (mainprops.visitortype == 'viewer') {
return(
<>
<h1>viewer navbar</h1>
</>
)}
else if (mainprops.visitortype =='buyside') {
return(
<>
<h1>buyside navbar</h1>
</>
)}
else if (mainprops.visitortype =='sellside') {
return(
<>
<h1>sellside navbar</h1>
</>
)}
};
export default Navbar;
如果这是正确的,那么这就是@amir 的意思吗?
解决方案
首先,传递道具有一定的规则:
- 您永远不会将文字对象作为道具传递,因为每次重新渲染都不相同,并且会导致子组件也重新渲染(没有任何新信息)
- 你不需要这样做
<Viewer visitortype='viewer' setvisitor={()=>setVisitorType()}/>
你可以:
<Viewer visitortype='viewer' setvisitor={setVisitorType}/>
因为它来自useState
反应确保setVisitorType
保持相同的参考
现在对于你的错误,你几乎纠正了你刚刚做了一个 js 语法错误,你应该这样写:
const MainView = (props) => {
return(
<>
<Navbar mainobj={{
visitortype:props.visitortype,
setvisitor:props.setvisitor
}}
/>
</>
)
};
export default MainView
但同样你永远不会将文字对象作为道具发送我会将它保存在 ref 或 state 中(取决于访问者状态是否会改变)
推荐阅读
- amazon-web-services - AWS AppSync - 放大代码生成类型而不创建任何内容
- azure - 在哪里可以找到 azure 身份范围及其权限级别的列表?
- r - R 编程:“[[k]][1:nrow(my_data)]”在我的建模函数中做了什么?寻找对 R 代码的更多理解
- javascript - 如何使用其中的文本大小调整 div 宽度
- java - 如何在 javafx 中实现可调整性?
- django - 将 Django 连接到 Microsoft SQL 数据库
- sql - 是否可以在 plpgsql 中编写 time_bucket_gapfill 替代方案
- reactjs - 没有正文的 axios 发布请求到达没有标头的服务器
- angular - 在 Firebase 上检索子索引
- python - 为什么我不断收到 ValueError:Python 中的数学域错误?