javascript - React 只理解随机键?

标签 javascript random reactjs ref

我遇到了非常奇怪的情况。如果未通过验证,我需要更改输入值:

if (!isValid) {
  //if invalid set previous value
  this.timeInput.value = previous value;
}

我正在使用masked input ,但与普通输入行为完全相同。

我发现我的输入更新了,就在调用下一次重新渲染之前这是我的第一个问题 - 为什么? 好吧,经过一番研究,我找到了解决方案 - 将键添加到输入,正如所说的添加 -

<input key={Math.random()}/>

它的工作!但最奇怪的是,当我尝试将值从随机更改为我的 id 属性时,类似于 -

key={Number(this.props.id)}

它不起作用!为什么?唯一的区别是我的 id 是整数(例如 3 ),但是 Math.random返回类似 0.21421214124 的内容。

组件:

handleTimeBoxBlur = (e) => {
    const newTime = convertToSeconds(e.target.value)
    //if nothing was changed
    if (newTime === this.props.slide.seconds) {
      return;
    }

    const isValid = this.props.checkValidation(this.props.slide.id, newTime)
    if (!isValid) {
       //if invalid set previous value
       this.timeInput.value = formatSS(this.props.slide.seconds);
       setTimeout(() => this.setState({isValid : true}), 6000) //remove field highlighting after 8 seconds
    }

    this.setState({isValid : isValid})
 }

 render() {
    <input 
      key={Math.random()}  
      styleName={inputStyleName}
      onBlur={this.handleTimeBoxBlur}
      ref={ref => this.timeInput = ref} 
      defaultValue={formatSS(this.props.slide.seconds)} />
 }

最佳答案

发生这种情况是因为您正在使用 uncontrolled input component (TL;DR,你没有任何 onChange 方法),我想知道它在你更改 key 之前是否有效。我尝试了两种方法,但都没有成功。正如所述here ,您需要使用受控组件来获得预期的行为。

尝试这样的事情:

  constructor(props) {
    super(props)
    this.state = {
      isValid: false,
      textValue: props.slide.seconds
    }

    this.handleTimeBoxBlur = this.handleTimeBoxBlur.bind(this)
    this.handleChange = this.handleChange.bind(this)
  }

  handleChange(e) {
    this.setState({ textValue: e.target.value })
  }

  handleTimeBoxBlur(e) {
    const newTime = this.state.textValue
    //if nothing was changed
    if (newTime === this.props.slide.seconds) {
      return;
    }

    const isValid = this.props.checkValidation(this.props.slide.id, newTime)

    if (!isValid) {
       //if invalid set previous value
       this.setState({textValue: this.props.slide.seconds});
       setTimeout(() => this.setState({isValid : true}), 6000) //remove field highlighting after 8 seconds
    }

    this.setState({isValid : isValid})
  }

   render() {
    return (
      <MaskedInput 
        key={this.props.slide.id}  
        mask={'11a'}
        onBlur={this.handleTimeBoxBlur} 
        value={this.state.textValue} 
        onChange={this.handleChange}
        />
        );
 }

关于javascript - React 只理解随机键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42269117/

相关文章:

reactjs - 用 typescript react map gl

javascript - 未知插件中的警告 : imageminSvgo. 您是否忘记安装插件?

javascript - 在 JavaScript 中从一组已知的潜在 ID 创建唯一字符串 ID/键的快速方法

javascript - iphone/ipad 杂志框架、iScroll 或更新版本?

javascript - React 按名称数组获取选择值

c++ - 用随机数创建一个 vector

python - 如何在python中生成具有两个精度的浮点随机数

python - 如何多次运行一个函数并返回不同的结果python

android - 如何将 react native android 应用程序提交到 playstore?

javascript - 响应式地将最大宽度 div 内的 div 拉伸(stretch)到视口(viewport)全 Angular ?