onClick

Electron

・実行する関数に引数があるかどうかで書き方が変わる

import { useState, useEffect } from 'react';

export default function Home() {
  const [tasks, setTasks] = useState(() => {
    const savedata = localStorage.getItem('tasks');
    return savedata ? JSON.parse(savedata) : [];
  });
  const [input, setInput] = useState('');

  // tasksの内容に変更があるたびに関数を実行する
  // addTask関数やdeleteTask関数内で毎度localStorage.setItem()してもいいが、
  // コッチのほうがReactの思想に沿っている
  useEffect(() => {
    localStorage.setItem('tasks', JSON.stringify(tasks));
  }, [tasks]);

  const addTask = () => {
    setTask([...tasks, input]);
    setInput('');
  };

  const deleteTask = (index) => {
    const newTasks = [...tasks];
    // 配列のindex+1番目(index=2なら3番目)から1つ削除する
    newTasks.splice(index, 1);
    setTasks(newTasks);
  };

  return (
    <>
      <ul>
        {tasks.map((task, idx) => (
          <li key={idx}>
            {task}
            // deleteTask関数は引数があるので()=>を入れること
            // onClick={deleteTask(idx)}にしてしまうと
            // コンポーネントがレンダリングされるときに関数が実行されてしまう
            // そのため、{task}を記述した直後に削除してしまい、追加ボタンを押しても何も表示されなくなってしまう
            <button onClick={() => deleteTask(idx)}>削除</button>
          </li>
        ))}
      </ul>
      <div>
        <input
          type="text"
          value={input}
          onChange={(e) => setInput(e.target.value)}
          placeholder="fill out task" />
        // addTask関数は引数がないのでコレでOK
        <button onClick={addTask} >追加</button>
      </div>
    </>
  );
}

BACK