gpt4 book ai didi

javascript - 如何正确传递具有传播属性的嵌套属性? (JSX)

转载 作者:可可西里 更新时间:2023-11-01 02:01:46 25 4
gpt4 key购买 nike

#1

你好。我有代码:

class Component extends React.Component {
render() {
this.props.nested.prop = this.props.parse.nested.prop;
return <div>Component</div>;
}
componentDidMount() {
console.log(this.props.nested.prop);
}
}
Component.defaultProps = {
nested: {
prop: "default",
},
};

const obj1 = {
nested: {
prop: "obj1",
},
};
const obj2 = {
nested: {
prop: "obj2",
},
};

class Application extends React.Component {
render() {
return (
<div>
<Component parse={obj1} />
<Component parse={obj2} />
</div>
);
}
}

React.render(<Application />, document.getElementById("app"));
// console output:
// "obj2"
// "obj2"

为什么我得到 2 个独立组件的 1 个变量引用,而不是每个组件的 2 个 nested.prop 实例?为什么 this.props 只保存组件所有实例挂载后最后设置的值?这是正常行为吗?我认为正确的行为是为不同的实例使用不同的属性值。

附言我已经测试了这段代码 here .

#2

jimfb已回答:“您正在改变传入的默认 Prop 。this.props.nested.prop = this.props.parse.nested.prop; 行是非法的。”

我的下一个问题:如何在不手动更改 props 的情况下传递嵌套属性?

例如:

Component.defaultProps = {
nested: {
prop1: "default",
prop2: "default",
},
};

const props = {
nested: {
prop1: "value",
},
};

let component = <Component {...props} />;

JSX 传播属性功能上面的代码指南只是覆盖了 props.nested 并且我丢失了默认的嵌套属性。但这不是我需要的。如何在JSX展开属性解析阶段实现嵌套对象的递归遍历?
或者对于这种情况是否有一些有用的模式?

最佳答案

这其实是个好问题!

简短回答:您不能使用扩展运算符进行深度合并 - 它只会进行浅层合并。但是你肯定可以编写函数来进行对象遍历并实现深度合并。

这实际上给您留下了 3 个选择:

1) 不要进行深度合并。如果你有 2 级嵌套对象,你可以做这样简单的事情:

const newNested = {...oldProps.nested, ...newProps.nested };
const finalProps = { ...oldProps, nested: newNested };

浅合并强制明确说您将拥有嵌套属性的新值。这是一件好事,因为它使您的代码显而易见。您还可以尝试可运行的示例 here .

2) 你可以使用不可变结构的库。 F.e. immutable.js .有了它,您的代码将看起来非常相似。

const oldProps = Immutable.fromJS({
nested:
{
prop1: "OldValue1",
prop2: "OldValue2",
}
});

const newProps = Immutable.fromJS({
nested:
{
prop1: "NewValue1",
}
});

const finalProps = oldProps.updateIn(['nested'], (oldNested)=>
oldNested.merge(newProps.get('nested'))
)

3) 你可能会使用深度合并:在 npm 中找到一些实现或自己编写你将有这样的代码(再次以 immutable.js 为例):

const finalProps = oldProps.mergeDeep(newProps);

在某些情况下您可能需要这样做,但是这样的代码使更新操作隐式并且会引发很多问题,这些问题已在列表中大量列出here

关于javascript - 如何正确传递具有传播属性的嵌套属性? (JSX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36265556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com