Передача значения поля ввода в родительский компонент в React - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь сделать что-то наподобие Hello World, но я хочу, чтобы пользователь мог ввести свое имя и фамилию, а затем в родительском элементе он скажет Hello, [FirstName] [LastName]!

Излишне говорить, что я довольно новичок в React, но я хотел иметь отдельный компонент специально для ввода имен.

App.js (родительский)

import React, { Component } from "react";
import logo from "./logo.svg";
import "./App.css";
import InsertName from "./insertName";

class App extends Component {
  state = {
    name: ""
  };
  handleClick = props=> {
    console.log("heyy", props.fname);
  };
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
      <h1 className="App-title">Welcome to React {this.state.name}</h1>
    </header>
    <p className="App-intro">
      To get started, editLdOL <code>src/App.js</code> and save to reload.
    </p>
    <InsertName onClick={this.handleClick} />
  </div>
);
  }
}

export default App;

Child, InsertName

import React, { Component } from "react";
class InsertName extends Component {
 render() {
return (
  <div>
    First name: <input type="text" name="fname" value={this.props.fName} />
    <br />
    Last name: <input type="text" name="lname" value={this.props.lName} />
    <br />
    <button onClick={this.props.onClick}>Click here!!</button>
  </div>
);
  }
}

export default InsertName;

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

В App.js (родительский)

import React, { Component } from "react";
import logo from "./logo.svg";
import "./App.css";
import InsertName from "./insertName";

    class App extends Component {
      state = {
        lName: '',
        fName: ''
      };
      handleClick = props=> {
        const {lName, fName} = this.state
        //Handle fName and lName here
      };
      onLNameChange = (e) => {
        this.setState({lName: e.target.value})
      }
      onFNameChange = (e) => {
        this.setState({fName: e.target.value})
      }
      render() {
        const {fName, lName} = this.state
        return (
          <div className="App">
            <header className="App-header">
              <img src={logo} className="App-logo" alt="logo" />
          <h1 className="App-title">Welcome to React {this.state.name}</h1>
        </header>
        <p className="App-intro">
          To get started, editLdOL <code>src/App.js</code> and save to reload.
        </p>
        <InsertName onLNameChange={this.onLNameChange} onFNameChange={this.onFNameChange} onClick={this.handleClick} fName={fName} lName={lName} />
      </div>
    );
      }
    }

    export default App;

В компоненте InsertName:

import React, { Component } from "react";
class InsertName extends Component {
 render() {
return (
  <div>
    First name: <input type="text" name="fname" onChange={this.props.onFNameChange} value={this.props.fName} />
    <br />
    Last name: <input type="text" name="lname" onChange={this.props.onLNameChange} value={this.props.lName} />
    <br />
    <button onClick={this.props.onClick}>Click here!!</button>
  </div>
);
  }
}

export default InsertName;
0 голосов
/ 19 сентября 2018

То, что вы спросили здесь, на самом деле довольно распространенный и стандартный способ изменения входных данных через дочерний компонент.Вы сохраните свое состояние в родительском компоненте, передадите некоторые части этого состояния и свои функции-обработчики своему дочернему компоненту, а затем обновите состояние.

  • Дочерний компонент может быть и большую часть временидолжен быть безгражданским, тупым компонентом.Потому что нет необходимости в состоянии или методе жизненного цикла.
  • Ваши входы контролируются.Это означает, что есть обработчик изменений для обновления вашего состояния, и они снова получают значение из состояния.
  • Вы можете изменить входные данные в одной функции обработчика по именам.

остальное в комментариях :) Кстати, если вы не смотрите официальную документацию, я настоятельно рекомендую вам сначала сделать это.

class App extends React.Component {
  state = {
    firstName: "",
    lastName: "",
    name: ""
  };

  handleClick = () => {
    const { firstName, lastName } = this.state;
    // We create our name then update our state.
    const name = `${firstName} ${lastName}`;
    this.setState({ name });
  };

  // One handler function to update the state.
  // Using computed property names feature we can use
  // variables for an object key like [name]

  handleChange = e => {
    // Destructuring values from e.target.
    const { name, value } = e.target;
    this.setState({ [name]: value });
  };

  render() {
    const { firstName, lastName, name } = this.state;
    return (
      <div>
        {/* A small condition check for our welcome. If there isn't any
        firstName or lastName, then we render "anonymous". */}
        <h1>
          Welcome,
          {!name ? " anonymous" : name}
        </h1>
        {/* Here, we are passing onClick and onChange handlers. Also our related state pieces. */}
        <InsertName
          firstName={firstName}
          lastName={lastName}
          onClick={this.handleClick}
          onChange={this.handleChange}
        />
      </div>
    );
  }
}

const InsertName = props => {
  // More destructuring.
  const { firstName, lastName, onClick, onChange } = props;

  return (
    // One onChange handler for each input.
    // Also, input names should match with the state names.
    <div>
      First name:{" "}
      <input
        type="text"
        name="firstName"
        value={firstName}
        onChange={onChange}
      />
      <br />
      Last name:{" "}
      <input type="text" name="lastName" value={lastName} onChange={onChange} />
      <br />
      <button onClick={onClick}>Click here!!</button>
    </div>
  );
};


ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
0 голосов
/ 19 сентября 2018

В родительском компоненте вы объявляете методы, которые устанавливают имя и фамилию следующим образом:

constructor(){
   this.state = { fname: "", lname: "" };
}

changeFirstName = (newName) => {
   this.setState({ fname: newName });
}

changeLastName = (newName) => {
   this.setState({ lname: newName });
}

handleClick = () => {
   console.log("Hey ", this.state.fname, " ", this.state.lname);
}

Затем передаете их дочернему компоненту в виде реквизитов:

<InsertName
   onClick={this.handleClick}
   fname={this.state.fname}
   changeFirstName={this.changeFirstName}
   lname={this.state.lname}
   changeLastName={this.changeLastName}
/>

Наконец, доступ к ним в вашем дочернем компоненте, как это:

<div>
   First name: <input type="text" name="fname" value={this.props.fname} onChange={(event) => this.props.changeFirstName(event.target.value)} />
   <br />
   Last name: <input type="text" name="lname" value={this.props.lName} onChange={(event) => this.props.changeLastName(event.target.value)} />
   <br />
   <button onClick={this.props.onClick}>Click here!!</button>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...