What's the right way to pass form element state to sibling/parent elements?

后端 未结 10 760
情话喂你
情话喂你 2020-11-29 15:04
  • Suppose I have a React class P, which renders two child classes, C1 and C2.
  • C1 contains an input field. I\'ll refer to this input field as Foo.
  • M
10条回答
  •  暖寄归人
    2020-11-29 15:20

    Five years later with introduction of React Hooks there is now much more elegant way of doing it with use useContext hook.

    You define context in a global scope, export variables, objects and functions in the parent component and then wrap children in the App in a context provided and import whatever you need in child components. Below is a proof of concept.

    import React, { useState, useContext } from "react";
    import ReactDOM from "react-dom";
    import styles from "./styles.css";
    
    // Create context container in a global scope so it can be visible by every component
    const ContextContainer = React.createContext(null);
    
    const initialAppState = {
      selected: "Nothing"
    };
    
    function App() {
      // The app has a state variable and update handler
      const [appState, updateAppState] = useState(initialAppState);
    
      return (
        

    Passing state between components

    {/* This is a context provider. We wrap in it any children that might want to access App's variables. In 'value' you can pass as many objects, functions as you want. We wanna share appState and its handler with child components, */} {/* Here we load some child components */}
    ); } // Child component Book function Book(props) { // Inside the child component you can import whatever the context provider allows. // Earlier we passed value={{ appState, updateAppState }} // In this child we need the appState and the update handler const { appState, updateAppState } = useContext(ContextContainer); function handleCommentChange(e) { //Here on button click we call updateAppState as we would normally do in the App // It adds/updates comment property with input value to the appState updateAppState({ ...appState, comment: e.target.value }); } return (

    {props.title}

    ${props.price}


    ); } // Just another child component function DebugNotice() { // Inside the child component you can import whatever the context provider allows. // Earlier we passed value={{ appState, updateAppState }} // but in this child we only need the appState to display its value const { appState } = useContext(ContextContainer); /* Here we pretty print the current state of the appState */ return (

    appState

    {JSON.stringify(appState, null, 2)}
    ); } const rootElement = document.body; ReactDOM.render(, rootElement);

    You can run this example in the Code Sandbox editor.

提交回复
热议问题