Реагирует на значение нагрузки и позволяет пользователю изменять значение в компоненте. - PullRequest
0 голосов
/ 10 сентября 2018

Я новичок в 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')
);

1 Ответ

0 голосов
/ 10 сентября 2018

Я думаю, что эту ситуацию можно немного упростить:

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)} />;
  }
}

Здесь у нас есть два компонента: <RangeInput>, компонент без состояния, и <Application>, мозги, стоящие за операцией.

<Application> отслеживает состояние и передает функцию обратного вызова в RangeInput. Затем при нажатии клавиши <RangeInput> передает объект события этой функции обратного вызова. Затем приложение использует объект события для обновления состояния и localStorage. При обновлении последнее сохраненное значение извлекается из localStorage и присутствует на входе (если доступно).

...