Gutenberg RangeControl

时间:2019-01-07 作者:Andrea

我正在尝试使用RangeControl 组成部分这就是我正在做的:

el(
    RangeControl,
    {
        label: \'Columns\',
        value: props.attributes.my_attribute,
        initialPosition: 1,
        min: 0,
        max: 3,
        onChange: function( val ) {
        }
    }
),
这工作正常,但如果我在value 参数(并通过onChange 事件),则组件停止工作(实际上onChange 事件,但组件无法正确渲染(移动当前值指示器)。

var my_variable = 1;

el(
    RangeControl,
    {
        label: \'Columns\',
        value: my_variable,
        initialPosition: 1,
        min: 0,
        max: 3,
        onChange: function( val ) {
            my_variable = val;
        }
    }
),
这里有我遗漏的东西吗?这是预期的行为,还是我在组件中意外发现了一个bug?

非常感谢。

1 个回复
最合适的回答,由SO网友:Alvaro 整理而成

使用修改块属性的控件时,需要将控件的值设置为属性的值,onChange函数需要使用setAttributes函数更改属性:

el(
    RangeControl,
    {
        label: \'Columns\',
        value: props.attributes.my_attribute,
        initialPosition: 1,
        min: 0,
        max: 3,
        onChange: function( val ) {
            props.setAttributes({ my_attribute: val })
        }
    }
),
上面的示例链接到一个块。块属性修改零部件状态。如果您想自己修改状态,可以将其链接到redux存储。或者您可以通过withState HOC. 为此,您需要将组件包装在withState 并使用it提供的道具进行更新。

const { withState } = wp.compose;
const { Component } = wp.element;
const { RangeControl } = wp.components;

class Range extends Component {
    render() {
        const { my_number, setState } = this.props;

        return (
            <RangeControl
                value={my_number}
                min={0}
                max={3}
                onChange={value => {
                    setState({ my_number: value });
                }}
            />
        );
    }
}

export default withState({ my_number: 1 })(Range);