【问题标题】:ReactJS switching input element from controlled to uncontrolled with defined value stateReactJS 使用定义的值状态将输入元素从受控切换到不受控
【发布时间】:2020-03-04 22:05:10
【问题描述】:

我失败的部分代码如下所示:

const normalizeInput = (value, previousValue) => {
    if (!value) return value;
    const currentValue = value.replace(/[^\d]/g, '');
    const cvLength = currentValue.length;

    if (!previousValue || value.length > previousValue.length) {
    if (cvLength < 4) return currentValue;
    if (cvLength < 7) return `(${currentValue.slice(0, 3)}) ${currentValue.slice(3)}`;
    return `(${currentValue.slice(0, 3)}) ${currentValue.slice(3, 6)}-${currentValue.slice(6, 10)}`;
    }
    else {
       if (cvLength < 4) return currentValue;
       if (cvLength < 7) return `(${currentValue.slice(0, 3)}) ${currentValue.slice(3)}`;
    }
};


class Example extends Component {

constructor(props) {
    super(props);

    console.log(JSON.stringify(props))

    this.state = {
        editable: {},
        phoneNumber: '(123) 555-1234'
    }
}

handlePhoneChange(id, value) {
    this.setState(prevState=> ({ [id]: normalizeInput(value, prevState[id]) }));
};

render(){
    return(

        <input
        type="text"
        className="form-control react-form-input"
        id="phoneNumber"
        name="phoneNumber"
        value={this.state.phoneNumber}
        onChange={(e) => {this.handlePhoneChange('phoneNumber', e.target.value)}}
        />

    )}
}

它会抱怨

一个组件正在将文本类型的受控输入更改为 不受控制。输入元素不应从受控切换到 不受控制的

value={this.state.phoneNumber}

但是当我将其设置为 value={this.state.phoneNumber || ''} 时不会,但随后更改将删除整个 phoneNumber 值而不是字符。

有什么建议吗?

【问题讨论】:

    标签: reactjs forms input


    【解决方案1】:

    发生这种情况是因为您的 normalizeInputvalue.length &lt;= previousValue.length 时没有返回任何内容(当您删除某些内容时

    所以undefined 存储在您的状态中,然后作为value 提供给您的input,实际上使其不受控制。


    || '' 解决了这个问题,因为当您的值为 undefined 时,您传递了 '' 空字符串,因此 input 永远不会收到 undefined 值。

    【讨论】:

    • 好的,但是当我添加|| ' 然后我会删除一些东西时,是什么导致删除整个输入值?在normalizeInput 中添加else 语句以返回编辑值应该更好吗?
    • 我在normalizeInput 中添加了else 语句,但它仍然抱怨将元素切换为不受控制。
    • @JackTheKnife 如果cvLength &gt;= 7 在您的else 块中,您仍然返回undefined。您的normalizeInput 应该无法返回undefined,否则input 将变得不受控制。
    猜你喜欢
    • 2017-09-27
    • 2020-11-01
    • 1970-01-01
    • 2019-05-07
    • 2020-07-08
    • 2020-07-27
    • 2018-08-28
    • 2017-06-30
    • 2019-10-24
    相关资源
    最近更新 更多