如何正确传递具有传播属性的嵌套属性? (JSX)
How to pass nested properties with spread attributes correctly? (JSX)
#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挂载后只保存组件所有实例的最后一个设置值?这是正常行为吗?
我认为正确的行为是对不同的实例使用不同的 属性 值。
P.S。我已经测试了这段代码 here.
#2
jimfb 已回答:
"You are mutating the default prop that was passed in. The line this.props.nested.prop = this.props.parse.nested.prop; is illegal."
我的下一个问题:
How to pass nested properties without a manual mutation of 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) 你可能会用到deep merge:在npm中找一些实现或者自己写
你会得到这样的代码(再次以 immutable.js 为例):
const finalProps = oldProps.mergeDeep(newProps);
在某些情况下你可能想要这个,但是这样的代码使更新操作隐式并且它会引发很多问题,这些问题被大大列出here
#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挂载后只保存组件所有实例的最后一个设置值?这是正常行为吗? 我认为正确的行为是对不同的实例使用不同的 属性 值。
P.S。我已经测试了这段代码 here.
#2
jimfb 已回答:
"You are mutating the default prop that was passed in. The line this.props.nested.prop = this.props.parse.nested.prop; is illegal."
我的下一个问题:
How to pass nested properties without a manual mutation of 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) 你可能会用到deep merge:在npm中找一些实现或者自己写 你会得到这样的代码(再次以 immutable.js 为例):
const finalProps = oldProps.mergeDeep(newProps);
在某些情况下你可能想要这个,但是这样的代码使更新操作隐式并且它会引发很多问题,这些问题被大大列出here