Cách nào đúng để truyền trạng thái phần tử biểu mẫu cho các phần tử anh chị em / cha mẹ?


186
  • Giả sử tôi có lớp React P, biểu hiện hai lớp con là C1 và C2.
  • C1 chứa một trường đầu vào. Tôi sẽ đề cập đến trường đầu vào này là Foo.
  • Mục tiêu của tôi là để cho C2 phản ứng với những thay đổi trong Foo.

Tôi đã đưa ra hai giải pháp, nhưng cả hai đều không cảm thấy đúng.

Giải pháp đầu tiên:

  1. Chỉ định P một trạng thái , state.input.
  2. Tạo một onChangehàm trong P, trong đó có một sự kiện và tập hợp state.input.
  3. Truyền cái này onChangecho C1 dưới dạng a propsvà để C1 liên kết this.props.onChangevới onChangeFoo.

Những công việc này. Bất cứ khi nào giá trị của Foo thay đổi, nó sẽ kích hoạt a setStatetrong P, vì vậy P sẽ có đầu vào để chuyển sang C2.

Nhưng nó không hoàn toàn đúng vì lý do tương tự: Tôi đang đặt trạng thái của phần tử cha từ phần tử con. Điều này dường như phản bội nguyên tắc thiết kế của React: luồng dữ liệu một chiều.
Đây có phải là cách tôi phải làm hay không, hay có một giải pháp React-tự nhiên hơn?

Giải pháp thứ hai:

Chỉ cần đặt Foo vào P.

Nhưng đây có phải là một nguyên tắc thiết kế mà tôi nên tuân theo khi cấu trúc ứng dụng của mình, đưa tất cả các yếu tố hình thức vào renderlớp cao nhất?

Giống như trong ví dụ của tôi, nếu tôi có kết xuất C1 lớn, tôi thực sự không muốn đặt toàn bộ renderC1 thành renderP chỉ vì C1 có thành phần biểu mẫu.

Tôi nên làm thế nào?


Tôi sắp làm chính xác điều tương tự và mặc dù nó hoạt động tốt, tôi có cảm giác nó chỉ là một vụ hack khổng lồ
Mirko

Câu trả lời:


198

Vì vậy, nếu tôi hiểu bạn một cách chính xác, giải pháp đầu tiên của bạn là gợi ý rằng bạn đang giữ trạng thái trong thành phần gốc của mình? Tôi không thể nói cho những người tạo ra React, nhưng nói chung, tôi thấy đây là một giải pháp thích hợp.

Duy trì trạng thái là một trong những lý do (ít nhất là tôi nghĩ) rằng React đã được tạo ra. Nếu bạn đã từng triển khai phía máy khách mẫu trạng thái của riêng mình để xử lý giao diện người dùng động có nhiều phần chuyển động phụ thuộc lẫn nhau, thì bạn sẽ thích React, vì nó làm giảm bớt nỗi đau quản lý trạng thái này.

Bằng cách duy trì trạng thái tiếp theo trong cấu trúc phân cấp và cập nhật thông qua sự kiện, luồng dữ liệu của bạn vẫn còn khá nhiều hướng, bạn chỉ phản hồi các sự kiện trong thành phần Root, bạn không thực sự nhận được dữ liệu ở đó thông qua liên kết hai chiều, bạn đang nói với thành phần Root rằng "này, có gì đó đã xảy ra ở đây, hãy kiểm tra các giá trị" hoặc bạn đang chuyển trạng thái của một số dữ liệu trong thành phần con lên để cập nhật trạng thái. Bạn đã thay đổi trạng thái trong C1 và bạn muốn nhận biết về trạng thái đó, do đó, bằng cách cập nhật trạng thái trong thành phần Root và kết xuất lại, các đạo cụ của C2 hiện đã được đồng bộ hóa do trạng thái được cập nhật trong thành phần Root và được truyền qua .

class Example extends React.Component {
  constructor (props) {
    super(props)
    this.state = { data: 'test' }
  }
  render () {
    return (
      <div>
        <C1 onUpdate={this.onUpdate.bind(this)}/>
        <C2 data={this.state.data}/>
      </div>
    )
  }
  onUpdate (data) { this.setState({ data }) }
}

class C1 extends React.Component {
    render () {
      return (
        <div>
          <input type='text' ref='myInput'/>
          <input type='button' onClick={this.update.bind(this)} value='Update C2'/>
        </div>
      )
    }
    update () {
      this.props.onUpdate(this.refs.myInput.getDOMNode().value)
    }
})

class C2 extends React.Component {
    render () {
      return <div>{this.props.data}</div>
    }
})

ReactDOM.renderComponent(<Example/>, document.body)

5
Không vấn đề gì. Tôi thực sự đã quay trở lại sau khi viết bài đăng này và đọc lại một số tài liệu, và nó dường như phù hợp với suy nghĩ và thực tiễn tốt nhất của họ. React có tài liệu thực sự xuất sắc, và mỗi khi tôi tự hỏi nên đi đâu đó, họ thường để nó ở đâu đó trong tài liệu. Kiểm tra phần về trạng thái ở đây, facebook.github.io/react/docs/iêu
bắt giữ

@captray nhưng những gì về, nếu C2có một getInitialStatedữ liệu và bên trong rendernó sử dụng this.state.data?
Dmitry Polushkin

2
@DmitryPolushkin Nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn chuyển dữ liệu từ Thành phần gốc của mình sang C2 làm đạo cụ. Trong C2, dữ liệu đó sẽ được đặt ở trạng thái ban đầu (ví dụ getInitialState: function () {return {someData: this.props.dataFromParentThatWillChange}} và bạn sẽ muốn triển khai thành phầnWillReceiveProps và gọi this.setState với đạo cụ mới để cập nhật thành phần mới. trạng thái trong C2. Kể từ khi tôi trả lời ban đầu, tôi đã sử dụng Flux và rất khuyến khích bạn cũng nên xem nó. Nó làm cho các thành phần của bạn sạch hơn và sẽ thay đổi cách bạn nghĩ về trạng thái.
chụp

3
@DmitryPolushkin Tôi muốn đăng bài này để theo dõi. facebook.github.io/react/tips/ ( Không sao, miễn là bạn biết bạn đang làm gì và bạn biết rằng dữ liệu sẽ thay đổi, nhưng trong nhiều tình huống bạn có thể di chuyển mọi thứ xung quanh. Cũng cần lưu ý rằng bạn không phải xây dựng hệ thống này như một hệ thống phân cấp. Bạn có thể gắn C1 và C2 tại các vị trí khác nhau trong DOM và cả hai đều có thể lắng nghe để thay đổi các sự kiện trên một số dữ liệu. Tôi thấy rất nhiều người thúc đẩy các thành phần phân cấp khi họ không cần chúng.
bắt giữ

5
Đoạn mã trên có 2 lỗi - cả hai lỗi liên quan đến việc không ràng buộc "điều này" trong ngữ cảnh phù hợp, tôi đã thực hiện các chỉnh sửa ở trên và cho bất kỳ ai cần một bản trình diễn codepen
Alex H

34

Đã sử dụng React để xây dựng một ứng dụng bây giờ, tôi muốn chia sẻ một vài suy nghĩ cho câu hỏi này tôi đã hỏi cách đây nửa năm.

Tôi khuyên bạn nên đọc

Bài đăng đầu tiên cực kỳ hữu ích để hiểu cách bạn nên cấu trúc ứng dụng React của mình.

Flux trả lời câu hỏi tại sao bạn nên cấu trúc ứng dụng React của mình theo cách này (trái ngược với cách cấu trúc nó). React chỉ là 50% của hệ thống, và với Flux bạn có thể nhìn thấy toàn bộ bức tranh và xem cách chúng tạo thành một hệ thống mạch lạc.

Quay lại câu hỏi.

Đối với giải pháp đầu tiên của tôi, hoàn toàn ổn khi để người xử lý đi theo hướng ngược lại, vì dữ liệu vẫn đang đi theo hướng đơn.

Tuy nhiên, việc cho phép trình xử lý kích hoạt setState trong P có thể đúng hay sai tùy thuộc vào tình huống của bạn.

Nếu ứng dụng là trình chuyển đổi Markdown đơn giản, C1 là đầu vào thô và C2 là đầu ra HTML, bạn có thể để C1 kích hoạt setState trong P, nhưng một số người có thể cho rằng đây không phải là cách được khuyến nghị.

Tuy nhiên, nếu ứng dụng là danh sách việc cần làm, C1 là đầu vào để tạo một việc cần làm mới, thì danh sách việc cần làm trong HTML, có lẽ bạn muốn xử lý để tăng hai cấp so với P - dispatchercho phép storecập nhật data store, sau đó gửi dữ liệu tới P và điền vào các khung nhìn. Xem bài viết Flux đó. Đây là một ví dụ: Flux - TodoMVC

Nói chung, tôi thích cách được mô tả trong ví dụ về danh sách việc cần làm. Càng ít trạng thái trong ứng dụng của bạn càng tốt.


7
Tôi thường xuyên thảo luận điều này trong các bài thuyết trình về cả React và Flux. Điểm tôi cố gắng nhấn mạnh là những gì bạn đã mô tả ở trên và đó là sự tách biệt giữa Trạng thái Ứng dụng và Trạng thái Ứng dụng. Có những tình huống mọi thứ có thể chuyển từ trạng thái View sang trạng thái Ứng dụng, đặc biệt là trong trường hợp bạn lưu trạng thái của UI (như các giá trị đặt trước). Tôi nghĩ thật tuyệt vời khi bạn trở lại với suy nghĩ của chính mình một năm sau đó. +1
bắt giữ

@captray Vậy chúng ta có thể nói rằng redux mạnh hơn phản ứng trong mọi hoàn cảnh không? Mặc dù đường cong học tập của họ ... (đến từ Java)
Bruce Sun

Tôi không chắc ý của bạn là gì. Họ xử lý hai điều khác nhau rất tốt, và là một sự tách biệt đúng đắn của mối quan tâm.
bắt

1
Chúng tôi có một dự án sử dụng redux, và nhiều tháng vào đó, dường như các hành động được sử dụng cho mọi thứ. Nó giống như sự pha trộn lớn của mã spaghetti và không thể hiểu được, thảm họa hoàn toàn. Quản lý nhà nước có thể là tốt, nhưng có thể bị hiểu lầm nghiêm trọng. Có an toàn không khi cho rằng từ thông / redux chỉ nên được sử dụng cho các phần của trạng thái cần được truy cập trên toàn cầu?
wayofthefuture

1
@wayofthefuture Không thấy mã của bạn, tôi có thể nói rằng tôi thấy rất nhiều spaghetti React giống như ole spaghetti jQuery tốt. Lời khuyên tốt nhất tôi có thể cung cấp là thử và làm theo SRP. Làm cho các thành phần của bạn đơn giản nhất có thể; thành phần kết xuất câm nếu bạn có thể. Tôi cũng thúc đẩy các khái niệm trừu tượng như thành phần <DataProvider />. Nó làm một điều tốt. Cung cấp dữ liệu. Điều này thường trở thành thành phần 'gốc' và truyền dữ liệu xuống bằng cách tận dụng trẻ em (và nhân bản) làm đạo cụ (hợp đồng được xác định). Cuối cùng, hãy thử nghĩ về Máy chủ trước. Nó sẽ làm cho JS của bạn sạch hơn với cấu trúc dữ liệu tốt hơn.
bắt

5

Giải pháp đầu tiên, với việc giữ trạng thái trong thành phần cha mẹ , là giải pháp chính xác . Tuy nhiên, đối với các vấn đề phức tạp hơn, bạn nên suy nghĩ về một số thư viện quản lý nhà nước , redux là một trong những phổ biến nhất được sử dụng với phản ứng.


Đã đồng ý. Phản hồi của tôi đã được viết lại khi hầu hết đang viết những điều trong "Phản ứng thuần túy". Trước sự bùng nổ thông lượng.
bắt

5

Năm năm sau, với việc giới thiệu React Hook, giờ đây có cách làm thanh lịch hơn nhiều với việc sử dụng hook hookContext.

Bạn xác định bối cảnh trong phạm vi toàn cầu, xuất các biến, đối tượng và hàm trong thành phần cha mẹ và sau đó bọc con trong Ứng dụng trong ngữ cảnh được cung cấp và nhập bất cứ thứ gì bạn cần trong các thành phần con. Dưới đây là một bằng chứng về khái niệm.

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 (
    <div>
      <h1>Passing state between components</h1>

      {/* 
          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,           
       */}
      <ContextContainer.Provider value={{ appState, updateAppState }}>
        {/* Here we load some child components */}
        <Book title="GoT" price="10" />
        <DebugNotice />
      </ContextContainer.Provider>
    </div>
  );
}

// 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 (
    <div className="book">
      <h2>{props.title}</h2>
      <p>${props.price}</p>
      <input
        type="text"
        //Controlled Component. Value is reverse vound the value of the variable in state
        value={appState.comment}
        onChange={handleCommentChange}
      />
      <br />
      <button
        type="button"
        // Here on button click we call updateAppState as we would normally do in the app
        onClick={() => updateAppState({ ...appState, selected: props.title })}
      >
        Select This Book
      </button>
    </div>
  );
}

// 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 (
    <div className="state">
      <h2>appState</h2>
      <pre>{JSON.stringify(appState, null, 2)}</pre>
    </div>
  );
}

const rootElement = document.body;
ReactDOM.render(<App />, rootElement);

Bạn có thể chạy ví dụ này trong trình soạn thảo Code Sandbox.

Chỉnh sửa trạng thái chuyển qua trạng thái


2

Tôi ngạc nhiên rằng không có câu trả lời nào với giải pháp React thành ngữ đơn giản tại thời điểm tôi đang viết. Vì vậy, đây là một (so sánh kích thước và độ phức tạp với những người khác):

class P extends React.Component {
    state = { foo : "" };

    render(){
        const { foo } = this.state;

        return (
            <div>
                <C1 value={ foo } onChange={ x => this.setState({ foo : x })} />
                <C2 value={ foo } />
            </div>
        )
    }
}

const C1 = ({ value, onChange }) => (
    <input type="text"
           value={ value }
           onChange={ e => onChange( e.target.value ) } />
);

const C2 = ({ value }) => (
    <div>Reacting on value change: { value }</div>
);

Tôi đang đặt trạng thái của phần tử cha từ phần tử con. Điều này dường như phản bội nguyên tắc thiết kế của React: luồng dữ liệu một chiều.

Bất kỳ cách kiểm soát nàoinput (cách thức làm việc với các biểu mẫu trong React) đều cập nhật trạng thái cha mẹ trong trạng thái cha mẹonChange gọi lại và vẫn không phản bội bất cứ điều gì.

Nhìn kỹ vào thành phần C1, ví dụ. Bạn có thấy bất kỳ sự khác biệt đáng kể nào trong cách thức C1inputthành phần tích hợp xử lý các thay đổi trạng thái không? Bạn không nên, bởi vì không có. Nâng trạng thái và chuyển xuống các cặp giá trị / onChange là thành ngữ cho React thô. Không sử dụng refs, như một số câu trả lời cho thấy.


1
Phiên bản phản ứng nào bạn đang sử dụng? Tôi đang nhận được các vấn đề thuộc tính của lớp thử nghiệm và foo không được xác định.
Isaac Pak

Đó không phải là về một phiên bản của phản ứng. Mã của thành phần đã sai. Đã sửa nó, thử ngay.
gaperton

Rõ ràng, bạn phải trích xuất thành viên trạng thái từ this.state, phần hoàn trả bị thiếu trong kết xuất và nhiều thành phần phải được gói trong div hoặc một cái gì đó. Không biết làm thế nào tôi bỏ lỡ điều đó khi tôi viết câu trả lời ban đầu. Phải là lỗi chỉnh sửa.
gaperton

1
Tôi thích giải pháp này. Nếu bất cứ ai muốn sửa lại nó, đây là một hộp cát cho bạn.
Isaac Pak

2

Câu trả lời gần đây hơn với một ví dụ, trong đó sử dụng React.useState

Giữ trạng thái trong thành phần cha mẹ là cách được khuyến nghị. Phụ huynh cần có quyền truy cập vào nó vì nó quản lý nó trên hai thành phần con. Chuyển nó sang trạng thái toàn cầu, giống như trạng thái được quản lý bởi Redux, không được khuyến nghị cho cùng một lý do tại sao biến toàn cầu tồi tệ hơn cục bộ nói chung trong công nghệ phần mềm.

Khi trạng thái nằm trong thành phần cha mẹ, đứa trẻ có thể biến đổi nó nếu cha mẹ cho đứa trẻ valuevà người onChangexử lý trong đạo cụ (đôi khi nó được gọi là liên kết giá trị hoặc mẫu liên kết trạng thái ). Đây là cách bạn sẽ làm điều đó với hook:


function Parent() {
    var [state, setState] = React.useState('initial input value');
    return <>
        <Child1 value={state} onChange={(v) => setState(v)} />
        <Child2 value={state}>
    </>
}

function Child1(props) {
    return <input
        value={props.value}
        onChange={e => props.onChange(e.target.value)}
    />
}

function Child2(props) {
    return <p>Content of the state {props.value}</p>
}

Toàn bộ thành phần cha mẹ sẽ kết xuất lại khi thay đổi đầu vào ở con, điều này có thể không thành vấn đề nếu thành phần cha mẹ nhỏ / nhanh để kết xuất lại. Hiệu suất kết xuất lại của thành phần cha mẹ vẫn có thể là một vấn đề trong trường hợp chung (ví dụ như các biểu mẫu lớn). Đây là vấn đề được giải quyết trong trường hợp của bạn (xem bên dưới).

Mẫu liên kết trạng tháikhông có kết xuất lại cha mẹ dễ dàng thực hiện hơn bằng thư viện của bên thứ 3, như Hookstate - siêu nạpReact.useState để bao gồm nhiều trường hợp sử dụng, bao gồm cả trường hợp của bạn. (Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của dự án).

Đây là cách nó sẽ trông như thế nào với Hookstate. Child1sẽ thay đổi đầu vào, Child2sẽ phản ứng với nó. Parentsẽ giữ trạng thái nhưng sẽ không kết xuất lại khi thay đổi trạng thái, chỉ Child1Child2sẽ.

import { useStateLink } from '@hookstate/core';

function Parent() {
    var state = useStateLink('initial input value');
    return <>
        <Child1 state={state} />
        <Child2 state={state}>
    </>
}

function Child1(props) {
    // to avoid parent re-render use local state,
    // could use `props.state` instead of `state` below instead
    var state = useStateLink(props.state)
    return <input
        value={state.get()}
        onChange={e => state.set(e.target.value)}
    />
}

function Child2(props) {
    // to avoid parent re-render use local state,
    // could use `props.state` instead of `state` below instead
    var state = useStateLink(props.state)
    return <p>Content of the state {state.get()}</p>
}

PS: có nhiều ví dụ khác ở đây bao gồm các kịch bản tương tự và phức tạp hơn, bao gồm dữ liệu lồng nhau sâu, xác thực trạng thái, trạng thái toàn cầu với setStatehook, v.v. Ngoài ra còn có ứng dụng mẫu hoàn chỉnh trực tuyến , sử dụng Hookstate và kỹ thuật được giải thích ở trên.


1

Bạn nên tìm hiểu thư viện Redux và ReactRedux. Nó sẽ cấu trúc các trạng thái và đạo cụ của bạn trong một cửa hàng và bạn có thể truy cập chúng sau này trong các thành phần của mình.


1

Với React> = 16.3, bạn có thể sử dụng ref và ForwardRef, để có quyền truy cập vào DOM con từ cha mẹ của nó. Đừng sử dụng cách giới thiệu cũ nữa.
Dưới đây là ví dụ sử dụng trường hợp của bạn:

import React, { Component } from 'react';

export default class P extends React.Component {
   constructor (props) {
      super(props)
      this.state = {data: 'test' }
      this.onUpdate = this.onUpdate.bind(this)
      this.ref = React.createRef();
   }

   onUpdate(data) {
      this.setState({data : this.ref.current.value}) 
   }

   render () {
      return (
        <div>
           <C1 ref={this.ref} onUpdate={this.onUpdate}/>
           <C2 data={this.state.data}/>
        </div>
      )
   }
}

const C1 = React.forwardRef((props, ref) => (
    <div>
        <input type='text' ref={ref} onChange={props.onUpdate} />
    </div>
));

class C2 extends React.Component {
    render () {
       return <div>C2 reacts : {this.props.data}</div>
    }
}

Xem RefsForwardRef để biết thông tin chi tiết về ref và ForwardRef.


0
  1. Điều đúng đắn cần làm là có trạng thái trong thành phần cha mẹ , để tránh ref và những gì không
  2. Một vấn đề là tránh liên tục cập nhật tất cả trẻ em khi gõ vào một lĩnh vực
  3. Do đó, mỗi đứa trẻ phải là một Thành phần (như không phải là PureComponent) và thực hiện shouldComponentUpdate(nextProps, nextState)
  4. Theo cách này, khi nhập vào trường biểu mẫu, chỉ có trường đó cập nhật

Mã dưới đây sử dụng @boundcác chú thích từ ES. Nội dung babel-plugin-transform-decorators-legacy của BabelJS 6 và các thuộc tính lớp (chú thích đặt giá trị này trên các hàm thành viên tương tự như liên kết):

/*
© 2017-present Harald Rudell <harald.rudell@gmail.com> (http://www.haraldrudell.com)
All rights reserved.
*/
import React, {Component} from 'react'
import {bound} from 'class-bind'

const m = 'Form'

export default class Parent extends Component {
  state = {one: 'One', two: 'Two'}

  @bound submit(e) {
    e.preventDefault()
    const values = {...this.state}
    console.log(`${m}.submit:`, values)
  }

  @bound fieldUpdate({name, value}) {
    this.setState({[name]: value})
  }

  render() {
    console.log(`${m}.render`)
    const {state, fieldUpdate, submit} = this
    const p = {fieldUpdate}
    return (
      <form onSubmit={submit}> {/* loop removed for clarity */}
        <Child name='one' value={state.one} {...p} />
        <Child name='two' value={state.two} {...p} />
        <input type="submit" />
      </form>
    )
  }
}

class Child extends Component {
  value = this.props.value

  @bound update(e) {
    const {value} = e.target
    const {name, fieldUpdate} = this.props
    fieldUpdate({name, value})
  }

  shouldComponentUpdate(nextProps) {
    const {value} = nextProps
    const doRender = value !== this.value
    if (doRender) this.value = value
    return doRender
  }

  render() {
    console.log(`Child${this.props.name}.render`)
    const {value} = this.props
    const p = {value}
    return <input {...p} onChange={this.update} />
  }
}

0

Khái niệm truyền dữ liệu từ cha mẹ sang con và ngược lại được giải thích.

import React, { Component } from "react";
import ReactDOM from "react-dom";

// taken refrence from https://gist.github.com/sebkouba/a5ac75153ef8d8827b98

//example to show how to send value between parent and child

//  props is the data which is passed to the child component from the parent component

class Parent extends Component {
  constructor(props) {
    super(props);

    this.state = {
      fieldVal: ""
    };
  }

  onUpdateParent = val => {
    this.setState({
      fieldVal: val
    });
  };

  render() {
    return (
      // To achieve the child-parent communication, we can send a function
      // as a Prop to the child component. This function should do whatever
      // it needs to in the component e.g change the state of some property.
      //we are passing the function onUpdateParent to the child
      <div>
        <h2>Parent</h2>
        Value in Parent Component State: {this.state.fieldVal}
        <br />
        <Child onUpdate={this.onUpdateParent} />
        <br />
        <OtherChild passedVal={this.state.fieldVal} />
      </div>
    );
  }
}

class Child extends Component {
  constructor(props) {
    super(props);

    this.state = {
      fieldValChild: ""
    };
  }

  updateValues = e => {
    console.log(e.target.value);
    this.props.onUpdate(e.target.value);
    // onUpdateParent would be passed here and would result
    // into onUpdateParent(e.target.value) as it will replace this.props.onUpdate
    //with itself.
    this.setState({ fieldValChild: e.target.value });
  };

  render() {
    return (
      <div>
        <h4>Child</h4>
        <input
          type="text"
          placeholder="type here"
          onChange={this.updateValues}
          value={this.state.fieldVal}
        />
      </div>
    );
  }
}

class OtherChild extends Component {
  render() {
    return (
      <div>
        <h4>OtherChild</h4>
        Value in OtherChild Props: {this.props.passedVal}
        <h5>
          the child can directly get the passed value from parent by this.props{" "}
        </h5>
      </div>
    );
  }
}

ReactDOM.render(<Parent />, document.getElementById("root"));


1
Tôi sẽ đề nghị bạn thông báo cho chủ sở hữu câu trả lời trước dưới dạng nhận xét để thêm mô tả do bạn cung cấp trong câu trả lời của anh ấy. Tiếp theo là giới thiệu tên của bạn cho phép lịch sự.
Thomas Easo

@ThomasEaso Tôi không thể tìm thấy anh ta ở đây, tôi đã kiểm tra nó. Có gợi ý nào khác không
akshay

nhấp vào nút "chỉnh sửa" ở bên trái biểu tượng của anh ấy và sửa đổi câu trả lời của anh ấy và gửi. nó sẽ được gửi tới người điều hành và họ sẽ cần những bình luận có giá trị của bạn.
Thomas Easo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.