React で状態を親コンポーネントに戻す

Oluwafisayo Oluwatayo 2024年2月15日
  1. コールバック関数を使用してデータを親コンポーネントに返す
  2. 小道具を使用して状態を親コンポーネントに戻す
  3. 複数の子コンポーネントから親コンポーネントにデータを渡す
  4. まとめ
React で状態を親コンポーネントに戻す

優れた開発者を平均から際立たせる 1つの点は、クリーンで適切にフォーマットされたコードを記述できることです。

これは、コーダーが 1つのコンポーネント内で情報を保存して操作を実行し、別のコンポーネントがデータにアクセスして使用できるようにする React 機能の背後にある頭脳です。これが、React の子コンポーネントと親コンポーネントの関係です。

親コンポーネントまたは元のコンポーネントには、処理する操作がすでにあります。親コンポーネントにデータを置き換え、更新、または追加するために別のプロセスを実行したいコーダーは、これを行うために子コンポーネントを作成します。

開発者が複数のデータを親に渡したい場合もあります。複数の子コンポーネントを作成することも、これを行うための理想的な方法です。

これにより、親コンポーネントが短くなり、コードが少なくなります。

コールバック関数を使用してデータを親コンポーネントに返す

callback 関数は、関数の操作が処理されると関数を呼び出すことができる React の概念です。これは、子コンポーネントの関数を親に呼び出す簡単な方法です。

まず、ターミナルから新しいプロジェクトを作成します。npx create-react-app illustrationone と入力します。

プロジェクトが作成されたら、エディターのフォルダーに移動し、src フォルダーに移動して、新しいファイル Child.js を作成します。この例では、App.jsChild.js を使用します。

App.js が親コンポーネントとして機能し、次のように callback 関数を開始します。

コードスニペット(App.js):

import React from 'react';
import Child from './Child'
class App extends React.Component{

    state = {
        name: "",
    }

    handleCallback = (childData) =>{
        this.setState({name: childData})
    }

    render(){
        const {name} = this.state;
        return(
            <div>
                <Child parentCallback = {this.handleCallback}/>
                {name}
            </div>
        )
    }
}
export default App

最初に name 状態を作成し、次に Child.js コンポーネントから name 変数に対応するデータを取得するコールバック関数を宣言します。

子コンポーネントからデータを取得したら、Child.jsname 変数に割り当てられたデータを返す関数を作成します。

次に、Child.js に移動し、ここで、実行する操作を宣言します。

コードスニペット(Child.js):

import React from 'react'
class Child extends React.Component{

    onTrigger = (event) => {
        this.props.parentCallback(event.target.myname.value);
        event.preventDefault();
    }

    render(){
        return(
        <div>
            <form onSubmit = {this.onTrigger}>
                <input type = "text"
                name = "myname" placeholder = "Enter Name"/>
                <br></br><br></br>
                <input type = "submit" value = "Submit"/>
                <br></br><br></br>
            </form>
        </div>
        )
    }
}
export default Child

出力:

コールバック関数を使用して、パス状態を親に反応させます

このデータを親に戻したいので、子コンポーネント内で callback 関数を開始する関数が必要です。ここで、onTrigger イベントリスナーが必要です。

Submit ボタンをクリックして結果が表示されると、onTrigger はすぐに callback 関数をアクティブにし、name 変数に割り当てられた値を親コンポーネントに戻します。

小道具を使用して状態を親コンポーネントに戻す

これは、前の例と比較してより簡単な方法です。props を使用して、処理された結果を親コンポーネントに返します。

src フォルダに移動し、新しいファイル User.js を作成します。これが子コンポーネントになります。

App.js は親コンポーネントであり、次のコードを渡します。

コードスニペット(App.js):

import React from 'react'
import './App.css';
import User from './User'
function App() {
  function getName(name) {
    alert(name)
  }
  return (
    <div className="App">
      <h1>Returning State Back to Parent</h1>
      <User getData={getName} />
    </div>
  );
}

export default App;

name 関数に割り当てられた日付を取得するように React フレームワークに指示する name 関数を作成します。次に、アラートを出します。つまり、ポップアップの形で戻ります。

次に、子コンポーネントである User.js にもう少しコードを追加します。

コードスニペット(User.js):

function User(props)
{
    const name="Oluwafisayo"
    return(
        <div>
            <h1>My Name is : </h1>
            <button onClick={()=>props.getData(name)} >Click Me</button>
        </div>
    )
}

export default User;

出力:

パス状態を小道具で親に反応させる

ここでは、データを name 関数に割り当て、Click me ボタンを押すと、onClick イベントリスナーがアクティブになり、データが小道具として親に返されます。props はプロパティの略であることに注意してください。

複数の子コンポーネントから親コンポーネントにデータを渡す

2つの子コンポーネントから親コンポーネントにデータを渡すため、親コンポーネント用に TodoList.js というファイルを作成し、子コンポーネント用に Todo.jsDeadlineList.js という 2つのファイルを作成します。

親コンポーネントには、子コンポーネントから取得するデータを取得するための関数を定義するコードが格納されます。

コードスニペット(TodoList.js):

import React from "react";
import Todo from "./Todo";
import DeadlineList from "./DeadlineList";

const TodoList = ({ todos, toggleTodo }) =>
  console.log(todos) || (
    <table>
      <tbody>
        <tr>
          <th className="taskTH">TASK</th>
          <th className="deadlineTH">DEADLINE</th>
        </tr>
        <tr>
          <td className="taskTD">
            {todos.map((todo) => (
              <Todo
                key={todo.id}
                text={todo.text}
                completed={todo.completed}
                toggleTodoItem={() => toggleTodo(todo.id)}
              />
            ))}
          </td>
          <td className="deadlineTd">
            {" "}
            {todos.map(
              (todo) =>
                console.log("TODO", todo) || (
                  <DeadlineList
                    key={todo.id}
                    value={todo.date}
                    completed={todo.completed}
                    onClick={() => toggleTodo(todo.id)}
                  />
                )
            )}
          </td>
        </tr>
      </tbody>
    </table>
  );

export default TodoList;

次に、フォームである Todo.js に取り組みます。データが入力され、[Todo の追加]ボタンをクリックすると、データが返されます。

コードスニペット(Todo.js):

import React, { useState } from 'react';
import wooHooSound from '../utils/wooHoo.js'

const Todo = (props) => {

    const { toggleTodoItem, completed, text } = props;

    let [ shouldPlaySound, setShouldPlaySound ] = useState(true);

    function wooHooEverySecondClick() {
        if (shouldPlaySound) {
            wooHooSound.play();
            setShouldPlaySound(false);
        } else {
            setShouldPlaySound(true);
        }
    }

    return (
        <li className="bananaLi"
            onClick={() => {
                toggleTodoItem();
                wooHooEverySecondClick();
            }}
            style={{
                textDecoration: completed ? 'line-through' : 'none'
            }}
        >

            {text}

        </li>
    );
};

export default Todo;

次に、DeadlineList.js は、リストをリスト形式の形式で親にレンダリングする役割を果たします。

コードスニペット(DeadlineList.js):

import React from "react";

const DeadlineList = ({ onClick, completed, value }) => {
  return (
    <li
      className="deadlineLi"
      onClick={onClick}
      style={{
        textDecoration: completed ? "line-through" : "none"
      }}
    >
      {new Intl.DateTimeFormat("en-US").format(value)}
    </li>
  );
};

export default DeadlineList;

次に、App.js 内のすべてをインポートします。

コードスニペット(App.js):

import React from 'react';
import AddTodo from '../containers/AddTodo'
import VisibleTodoList from '../containers/VisibleTodoList';
import Footer from './Footer';

const App = () => (

    <div className="appCSS">

        <AddTodo />
        <VisibleTodoList />
        <Footer />

    </div>

);

export default App;

出力:

複数の子コンポーネントから親にパス状態を反応させる

まとめ

開発者がチームとしてプロジェクトを構築する場合、コンポーネントごとに一貫性のあるショートコードを作成すると、チームメートからの支援を簡単に得ることができます。対照的に、コードが詰まっているプロジェクトは、支援したい仲間の開発者を簡単に延期します。

Oluwafisayo Oluwatayo avatar Oluwafisayo Oluwatayo avatar

Fisayo is a tech expert and enthusiast who loves to solve problems, seek new challenges and aim to spread the knowledge of what she has learned across the globe.

LinkedIn

関連記事 - React Component