2016-11-07 67 views
1

例如,子组件通过position={{x: 50}}。如何在子组件内重新分配this.props.position等于{{x: 50, y: 0}}反应:你如何分配对象道具的默认属性?

+0

请参阅React:https://github.com/facebook/react/issues/2568和另一个问题:http:// stackoverflow.com/questions/29194997/react-nested-defaultprops-deep-merge –

回答

1

看起来您正在使用React;如果您还使用ES2016你就可以使用Object.assign:

var initial = {x: 0, y: 0}; 
var passed = {x: 50}; 

var result = Object.assign({}, initial, passed); 

console.log(result); // { x: 50, y: 0 } 
+0

这些代码行是否需要在每个渲染之前运行,因为子组件无法修改它自己的道具? –

+0

是的,如果我了解您的要求,您只需将新值与默认值分配给局部变量,然后在渲染时使用该变量。 Object.assign不会改变道具。 –

0

如果你只是做了this.props.position你不能依赖于默认道具的工作,因为默认情况下不会道具检查特定的属性失踪该对象,但会检查是否存在道具。

最简单的方法是将有两个支柱:位X &位置▲

然后在你的孩子组件,您可以同时设置默认的道具,所以如果一个被传入,而不是其他,你可以回退到默认为另一个。

getDefaultProps: function() { 
    return { 
    positionX: 50, 
    positionY: 0 
    }; 
}, 

另一种选择是,以检查是否存在它的地方被在子组件中使用,并在使用同时具有Y和X值的新对象点进行操作。

例如使用对象解构:

var {x, y=50} = this.props.position

如果预计X可能是不确定的为y,然后你也可以给X的缺省值进行传递。如果this.props.position上存在x或y,那么它将覆盖默认设置

+0

这就是我试图避免 –

+0

可以与当时的对象解构做: VAR {X,Y = 50} = this.props.position 这将使y的50违约和x是等于这个.props.position中的任何东西。如果y确实存在,那么它将使用该默认值 – finalfreq

+0

会起作用,但有没有办法实际改变this.props的值,而不是为结构化变量创建默认值? –