如何在故事书中更新组件道具

时间:2017-08-28 11:53:43

标签: javascript reactjs storybook

< p>我正在使用< code> storybook< / code> (< a href =" https://github.com/storybooks/storybook" rel =" noreferrer"> this< / a>)单独使用我的组件。我想模拟所有的通量循环(在完整的应用程序中,它是在< code> redux< / code>的帮助下完成的)并使用故事中的简单对象更新属性,但我遗漏了一些东西。< ; / p为H. <预><代码> storiesOf(' Color picker',module).add(' base',()=> {     让colorPickerState = {       changeColor:function(data){         this.color = data.color       },       颜色:'#00aced'     }     回来(       <颜色拾取         命名="颜色"         的onChange = {colorPickerState.changeColor.bind(colorPickerState)}         值= {colorPickerState.color}       />     )   } < /代码>< /预> < p>我希望< code>值< / code> < code>< ColorPicker />< / code>的道具当< code> onChange< / code>时更新叫做;我可以看到< code> colorPickerState.color< / code>的值正确更新,但组件不会重新渲染。< / p> < p>我缺少什么?< / p>

3 个答案:

答案 0 :(得分:3)

您可以使用插件来实现此目的:https://github.com/Sambego/storybook-state

所以你的代码看起来像是:

import { State, Store } from '@sambego/storybook-state';

const store = new Store({
  value: '#00aced',
});

storiesOf('Color picker', module).add('base', () => {
  return (
    <State store={store}>
      <ColorPicker
        name="color"
        onChange={(data) => store.set({ value: data.color })}
      />
    </State>
  )
}

答案 1 :(得分:2)

您可以编写一个 dummy-component 并将其呈现在其中的真实故事组件,然后获得该 dummy-component 的{{1} }属性。

  

在以下示例中,我在 Slider 组件的故事中使用knobs addon

state

答案 2 :(得分:1)

我会尝试使用 react 中的 useState 钩子 - 通过其 setter 更新状态值似乎具有重新渲染故事书组件的效果。

我遇到了类似的问题,我的数据输入表单的状态和事件处理(包括复杂的验证)是在全局范围内完成的,在组件树的上一级。通过编写一个简单的事件处理程序传递给我的组件,我能够获得该组件的工作演示及其复杂的验证。

请注意,我的代码是在 Typescript 中的。我对 React 世界还很陌生,所以这可能并不完美。

// Things defined elsewhere: IComponentProps, IValidationResult, IFormInput, EntryForm
// useState and useCallbac comes from react
export const MyComponentDemo = (args: IComponentProps) => {

    const [validations, setValidations] = useState<IValidationResult[]>([]);
    const [theForm, setTheForm] = useState<IFormInput>(
        {
            ...args.formValues,
            // set other interesting default form values here
        }
    );

    const dummyValidationMethod = useCallback((form: IFormInput) => {

        let validations : IValidationResult[] = [];

        // Do validation using data from form

        setValidations(validations);
        setTheForm(form);

    }, []);

    return (
        <EntryForm
            {...args}
            formValues={theForm}
            onValidation={dummyValidationMethod}
            validatedLocations={validations}
        />
    );
};