0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

React Hooksの10種類を理解する(Basic: useState)

Posted at

React Hooksの10種類を理解する(Basic: useState)

useStateの基本

  • useState とは、state(状態)のvalueと、stateを更新するための関数を返すhooksである。

通常のReact

class TemperatureInput extends React.Component {
  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
    this.state = {temperature: ''};
  }

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

  render() {
    const temperature = this.state.temperature;
    const scale = this.props.scale;
    return (
      <fieldset>
        <legend>Enter temperature:</legend>
        <input value={temperature}
               onChange={this.handleChange} />
      </fieldset>
    );
  }
}

上記のcalculatorクラスの場合、初回で temperature の値は空白となっており、その状態を設定している。この値を更新する場合は、inputの onChange にてhandleChange 関数を立ち上げて、setState 関数によって、temperature の値をを更新している。これを、useState を使用すると、以下のようになる。

React Hooksを用いたCalculatorクラス

  • React HooksとTypeScriptを用いてcomponentを作成しています。
const TemperatureInput = () => {
  const [temperature, setTemperature] = useState<number>(); // ※1
  return (
    <fieldset>
      <legend>Enter temperature:</legend>
      <input
        value={temperature}
        onChange={(value: number) => setTemperature(value)}
      />
    </fieldset>
  )
}
  • useState で状態管理することによって、constructorhandleChange (update)の部分を一気にまとめて管理することができるようになる。これによって、コード量も減るので、よりわかりやすくなった。
  • (※1) useStateを定義してあげるときには、setState部分は、stateに set を付け加えてあげれば、基本的には大丈夫かと思います。

state の遅延初期化

  • もし、初期のstateが、単純な値を設定をしないのであれば、関数を渡すことも可能となっている。初回のrender時にのみ実行される。
const TemperatureInput = () => {
  const [temperature, setTemperature] = useState<number>((value: number) => {
    if (value <= 5 && value >= -5) {
      return 0;
    } else {
      return value;
    }
  });
  return (
    <fieldset>
      <legend>Enter temperature:</legend>
      <input
        value={temperature}
        onChange={(value: nuber) => setTemperature(value)}
      />
    </fieldset>
  )
}

state 更新の回避

  • state更新時に、現在の値と同じだった場合は、更新が回避されて処理が終了される。
  • もしrender中に高度な計算をしている場合は、useMemo を使用すると良い。

reference

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?