21

我正在使用storybook( this ) 单独使用我的组件。我想模拟所有通量周期(在完整的应用程序中,它是在 的帮助下完成的redux)并使用故事中的一个简单对象更新属性,但我错过了一些东西。

  storiesOf('Color picker', module).add('base', () => {
    let colorPickerState = {
      changeColor: function(data) {
        this.color = data.color
      },
      color: '#00aced'
    }
    return (
      <ColorPicker
        name="color"
        onChange={colorPickerState.changeColor.bind(colorPickerState)}
        value={colorPickerState.color}
      />
    )
  }

我希望在调用时更新value道具;我可以看到正确更新的值,但组件不会重新渲染。<ColorPicker />onChangecolorPickerState.color

我错过了什么?

4

4 回答 4

11

您可以编写一个dummy-component来在其中呈现真实故事组件,然后您就可以拥有该dummy-componentstate属性。

在下面的示例中,我在Slider组件的故事中使用了旋钮插件

stories.addDecorator(withKnobs)
    .add('Slider', () => {
        // create dummy component that wraps the Slider and allows state:
        class StoryComp extends React.Component {
            constructor( props ){
                super(props);

                this.state = {
                    value : this.props.value || 0,
                }
            }

            onValueChange = value => this.setState({ value })

            render(){
                const props = {
                    ...this.props, 
                    onValueChange:this.onValueChange, // <--- Reason "StoryComp" is needed
                    value:this.state.value            // <--- Reason "StoryComp" is needed
                }

                return <Slider {...props} />
            }
        }

        // knobs (customaziable props)
        const widthKnobOptions = {
            range : true,
            min   : 200,
            max   : 1500,
            step  : 1
        }

        const props = {
            value : number('value', 200000),
            min   : number('min', 100),
            step  : number('step', 1000),
            max   : number('max', 1000000),
            width : number('width', 700, widthKnobOptions)
        }

        return <StoryComp {...props} />
    }
);
于 2019-01-08T09:32:36.190 回答
6

您可以使用插件来实现此目的: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>
  )
}
于 2018-02-20T21:04:31.803 回答
1

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

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

请注意,我的代码在 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}
        />
    );
};
于 2021-02-12T19:25:07.453 回答
0

在最新版本 (v6) 中,此功能调用Args。您还可以使用 argTypes 来查看操作的日志或指定道具。

于 2021-10-28T12:02:42.110 回答