【问题标题】:React load value and allow user to alter value within component反应负载值并允许用户更改组件内的值
【发布时间】:2019-02-14 10:03:37
【问题描述】:

我是 React (16.4.2) 的新手,我正在尝试了解它的工作方式。我不想用redux 使事情复杂化;我只想了解核心反应库。

我有一个应用程序,并且(最终在子链下)有一个input,它是一个组件,RangeInput。它只是一个输入的包装组件。

问题分两部分

  1. 我应该能够更改范围内的值(作为用户)
  2. 如果本地存储中有数据,则应在第一时间加载。这也意味着用户应该仍然能够更改/更改输入值。

现在有了这个,我看到只能做另一个。我知道我不明白这里的东西。

需要做什么?

谢谢, 凯莉

以下是课程:

export class RangeInput extends React.Component {
    constructor(props) {
       super(props);
       this.ds = new DataStore();
       this.state = {
          value: props.value
       };
    }

    static getDerivedStateFromProps(props, state) {
        console.log('props', props, 'state', state);
        if (props.value !== state.value) {
          return {value: props.value};
        }

        return null;
    }

    onChange(event) {
      const target = event.target;

      this.setState({
        value: target.value
      });

      if (this.props.onChange) {
        this.props.onChange({value: target.value});
      }
   }

   onKeyUp(event) {
      if (event.keyCode !== 9) {
        return;
      }

      const target = event.target;

      if (this.props.onChange) {
        this.props.onChange({value: target.value});
      }
  }

  render() {
       return <div>
           <input type="number" value={this.state.value}
           onChange={this.onChange.bind(this)}
           onKeyUp={this.onKeyUp.bind(this)}/>
       </div>;
    }
}

const DATA_LOAD = 'load';
export class Application extends React.Component {
    constructor() {
       super();

       this.state = {
          value: -1,
          load = DATA_LOAD
       };
    }

    componentDidMount() {
      if (this.state.load === DATA_LOAD) {
         this.state.load = DATA_CLEAN;
         const eco = this.ds.getObject('the-app');
         if (eco) {
            this.setState({value: eco});
         }
       }
    }

    render(){
       return <RangeInput value={this.state.value} />;
    }
}


ReactDOM.render(
  <Application/>,
  document.getElementById('root')
);

【问题讨论】:

  • 好多代码好像漏掉了,能不能补一下或者做个沙盒?
  • 范围内是什么意思?您作为道具传递给 RangeInput 的值是什么,为什么?还有一件事永远不会直接在渲染中进行绑定,而是在构造函数中进行
  • 显然有更多的属性被发送到这个组件,RangeInput,但核心是设置,value 是问题所在。唯一要补充的是,Application 可以保存到本地存储,但只有在实际单击submit 时,这意味着没有“智能保存”功能

标签: javascript reactjs ecmascript-2017


【解决方案1】:

我觉得这种情况可以简化不少:

import React from 'react';

export const RangeInput = props => (
  <input
    value={props.value}
    onChange={props.setValue} />
)

export class Application extends React.Component {
  constructor(props) {
    super(props);
    this.state = { value: -1, };
  }

  componentDidMount() {
    var val = localStorage.getItem('myVal');
    if (val) this.setState({value: val})
  }

  setValue(e) {
    this.setState({value: e.target.value})
    localStorage.setItem('myVal', e.target.value);
  }

  render() {
    return <RangeInput
      value={this.state.value}
      setValue={this.setValue.bind(this)} />;
  }
}

这里我们有两个组件:&lt;RangeInput&gt;,一个无状态组件,和&lt;Application&gt;,操作背后的大脑。

&lt;Application&gt; 跟踪状态,并将回调函数传递给 RangeInput。然后,在 keydown 时,&lt;RangeInput&gt; 将事件对象传递给该回调函数。然后应用程序使用事件对象更新状态和localStorage。刷新时,从localStorage 获取最后保存的值并显示在输入中(如果可用)。

【讨论】:

  • 谢谢!我有一种感觉,有些东西对我来说没有点击。简而言之,当您描述 application 是这一切的大脑时(这就是我所尝试的),这对我来说是有意义的;这意味着我让它部分地做,而你让它做它是为了它的荣耀。我试图让组件管理自己的伪简单状态。实际上,这就是问题所在。应用程序应该一直在管理它(如您所示)。再次感谢您花时间向我展示流程,它对我帮助很大!
  • 找到完全的荣耀确实很棘手——我很高兴这有帮助!
猜你喜欢
  • 2019-01-18
  • 2022-01-03
  • 1970-01-01
  • 2019-07-26
  • 2017-09-15
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多