javascript - 动态解构道具?
问题描述
我目前正在AddProductPage
为我的网络应用程序构建一个组件。props
它从其父级接收一堆,AddProductContainer
并且应该将它们划分props
为它在页面上呈现的许多较小的组件。
例子:
添加ProductPage.js
function AddProductPage(props) {
return(
<React.Fragment>
<Component1
propsA={props.propsA}
propsB={props.propsB}
/>
<Component2
propsC={props.propsC}
propsD={props.propsD}
propsE={props.propsE}
/>
// And so on...
</React.Fragment>
);
}
我决定将整个props
对象分成更小的对象,每个组件一个,这样我就可以更清晰地看到我的代码将在页面上呈现的内容。喜欢:
function AddProductPage(props) {
const comp1Props = {
propsA: props.propsA,
propsB: props.propsB
}
const comp2Props = {
propsC: props.propsC,
propsD: props.propsD,
propsE: props.propsE
}
return(
<React.Fragment>
<Component1 {...comp1Props}/> // <--- Easier to see what will render
<Component2 {...comp2Porps}/>
// And so on...
</React.Fragment>
);
}
我目前正在考虑是否可以将所有动态解构(或其他方法)全部props
转换为单个变量,以便我可以编写如下内容:
function AddProductPage(props) {
// Some code to destructure all props into single variables
const comp1Props = {
propsA,
propsB
};
const comp2Props = {
propsC,
propsD,
propsE
};
return(
<React.Fragment>
<Component1 {...comp1Props}/> // <--- Easier to see what will render
<Component2 {...comp2Porps}/>
// And so on...
</React.Fragment>
);
}
我怎样才能做到这一点?
编辑
我想我的问题不够清楚。但我动态的意思是在不知道props
名称或有多少的情况下解构一切props
。可能吗?
喜欢:
const {...props} = {...props}; // This is pseudo code
这样,我认为我的代码将尽可能干净。谢谢。
解决方案
“将所有道具解构为单个变量的一些代码”将是简单的解构:
const { propsA, propsB, propsC, propsD, propsE } = props;
现场示例:
const props = {
propsA: "a",
propsB: "b",
propsC: "c",
propsD: "d",
propsE: "e"
};
const { propsA, propsB, propsC, propsD, propsE } = props;
const comp1Props = {
propsA,
propsB
};
const comp2Props = {
propsC,
propsD,
propsE
};
console.log(comp1Props);
console.log(comp2Props);
.as-console-wrapper {
max-height: 100% !important;
}
在评论中你已经澄清:
我动态的意思是在不知道道具名称或道具数量的情况下解构一切。
我问你怎么知道分配给comp1Props
vs什么comp2Props
,你说:
我仍然会决定并手动创建这些对象。但是,如果将新道具传递给
AddProductPage
,例如,我希望它能够自动解构并可以将其添加到 comp1Props 对象中。否则我必须记得先解构它,然后将它添加到comp1Props
对象中。
所以问题是:您能否为 中的所有props
属性自动创建常量/变量AddProductPage
,以便它们都可用于创建comp1Props
和的代码comp2Props
?
不,如果不使用with
在严格模式下不可用的令人困惑的功能 ( )(默认情况下在模块中启用),您将无法做到这一点。如果您可以使用with
,您只需在该块内with (props) { /*...*/ }
创建并创建您的comp1Props
and 。comp2Props
但是你不能with
在现代 JavaScript 中使用。
你可能最好做你已经在做的事情:
const comp1Props = {
propsA: props.propsA,
propsB: props.propsB
};
但是如果你想让它更短,你可以给自己一个可重用的实用函数:
function pick(source, ...props) {
const result = {};
for (const prop of props) {
result[prop] = source[prop];
}
}
然后在AddProductPage
:
function AddProductPage(props) {
const comp1Props = pick(props, "propsA", "propsB");
const comp2Props = pick(props, "propsC", "propsD", "propsE");
return(
<React.Fragment>
<Component1 {...comp1Props}/>
<Component2 {...comp2Porps}/>
// And so on...
</React.Fragment>
);
}
(有些人会把它硬塞进reduce
电话里,但没有必要。)
推荐阅读
- javascript - 我正在尝试将值从 HTML 输入传递到 JavaScript 函数,然后传递到顶点控制器以在 salesforce 中创建潜在客户
- bash - 如何在基于 MacOS 的 Github Action 运行器中设置 Bash 4 和其他 GNU 工具?
- javascript - 如何从 Javascript 数组中删除上传的文件?
- forms - Jet Engine Checkbox 元数据未显示在前端添加帖子表单中
- c++ - 用结构数组填充组合框(CLR 项目)
- uml - 我们可以使用 UmpleOnline 制作 UML 对象图吗?
- postgresql - 如何连接两个表 - 当您将用于 JOIN 的主键列中有多个值时
- r - 无法在 Ubuntu 20.04 上的 Rstudio 中加载已安装的软件包:sh: 1: make: not found
- mysql - 数据库设计。三元关系是唯一的方法吗?
- python-3.x - 在 yaml 配置中使用 python 变量名