我有一个Slider
组件,它不会处理自己的状态,而是包含在另一个名为SliderDrag
的组件中,该组件管理状态并将道具传递给Slider
我使用withState
库中的recompose
来实现这一目标。
这是我的Slider
州初始状态
export const getInitialState = () => ({
min: 0,
max: 100,
value: 50,
step: 1,
width: 100,
dragging: false
});
这是withState()
export const SliderDrag = withState('state', 'onChange', getInitialState())(
({state, onChange, action}) => (
<Slider
{...state}
onDragStart={({x}) => {
onChange(dragStart(x, state));
}}
onDrag={({x}) => {
onChange(drag(x, state));
action('value')(state.value);
}}
onDragEnd={() => {
onChange(dragEnd(state));
}}
/>
)
);
这就是我想要使用SliderDrag
的方法。我想传递道具来设置我的初始state
,以便我可以在我的应用中的不同上下文中使用此Slider
组件
export const interactive = (action) => (
<Storypage theme={designerTheme}>
<SliderDrag width={218} step={1} min={0} max={100} action={action}/>
</Storypage>
);
我是否需要使用compose
库中的recompose
?任何建议或帮助将受到高度赞赏。 :)
答案 0 :(得分:5)
在一些帮助下,我能够解决我的问题。
我应该传递对将initialState
设置为withState()
的最后一个参数的函数的引用,这样当initialState
被调用时,我将有权访问{{1我正在传递给我的props
组件
以下是我重构的方法
SliderDrag
const initialState = ({min, max, step, width, value}) => {
debugger;
return defaults({min, max, step, width, value}, defaultState());
};
export const SliderDrag = withState('state', 'onChange', initialState)(
({state, onChange, action}) => (
<Slider
{...state}
...
/>
)
);
这里只是覆盖了我传递的值,并为我defaults
提供了一个新对象。
这使我的state
可配置,因为任何其他component
都可以使用它并向下传递component
作为props