RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1100587
Accepted
Streammer
Streammer
Asked:2020-03-27 19:23:08 +0000 UTC2020-03-27 19:23:08 +0000 UTC 2020-03-27 19:23:08 +0000 UTC

在父子组件之间传递数据

  • 772

大家好。情况如下。我有两个组件:标题和搜索框。搜索框是一个输入 tupe = "searchbox",我在其中输入文本信息。Header 组件是 Searchbox 的父组件。那些。我在标题中呈现一个搜索框。我想要在 input 中输入的信息,这些信息将传递给 component 的 state。那些。如果更全局,即站点标题,它有一个输入,您可以在其中输入一些内容,并且此数据应存储在父组件的状态中。这是我的代码。搜索框组件

import React, { Component } from "react";
import "./style.scss";

class Searchbox extends Component {
  constructor(props) {
    super(props);
    this.state = { name: "", requestResult: null };
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    event.preventDefault();
    this.setState({ name: event.target.value });
  }

  handleSubmit(event) {
    event.preventDefault();
    // this.setState({ name: "" });
    console.log(this.state.name);
  }

  render() {
    const { requestResult, name } = this.state;
    return (
      <>
        <form
          id="search_movie"
          className="search-movie"
          onSubmit={this.handleSubmit}
        >
          <input
            type="search"
            value={name}
            onChange={this.handleChange}
            requestvalue={requestResult}
          />
        </form>
        <button
          onClick={name => {
            this.props.getData(name);
          }}
        >
          OK
        </button>
      </>
    );
  }
}
export default Searchbox;

标题组件

import React, { Component } from "react";  
import Searchbox from "../Searchbox";
import User from "../User";
import "./style.scss";

class Header extends Component {
  constructor(props) {
    super(props);
    this.state = { name: "" };  
  }

  getData = value => {
    this.setState({ name: value });
    console.log(this.state);
    console.log(value);
  };

  render() {
    return (
      <div className="movie-header">
        <div className="container">
          <div>Movie Catalog</div>
          <Searchbox getData={value => this.getData(value)} />
          <User />
       </div>
      </div>
    );
  }
}

export default Header;

单击“确定”按钮时,应触发 getData(value) 函数,该函数应将 value 值写入 Header 组件的状态。为什么在我的情况下不会发生这种情况?这是原始https://codesandbox.io/s/zealous-villani-u4rsm的链接

reactjs
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Denis Bubnov
    2020-03-27T20:39:49Z2020-03-27T20:39:49Z

    问题在于这里处理按钮OK点击的方法:

    onClick={name => {
      this.props.getData(name);
    }}
    

    如果您考虑含义,那么您根本不是在传输name,而是event。也就是说,您需要一个点击处理程序,例如:

    onOkClick = () => {
      const { name } = this.state;
      this.props.getData(name);
    };
    

    在这里,我们从状态中获取输入name并将其提供给getData. 我们将此方法指定为按钮的处理程序OK:

    <button onClick={this.onOkClick}>OK</button>
    

    此处附有示例代码(基于您的):

    class Searchbox extends React.Component {
      constructor(props) {
        super(props);
        this.state = { name: "" };
        
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      }
    
      
      handleChange(event) {
        event.preventDefault();
        this.setState({ name: event.target.value });
      }
      
      handleSubmit(event) {
        event.preventDefault();
        // this.setState({ name: "" });
        console.log(this.state.name);
      }
      
      onOkClick = () => {
        const { name } = this.state;
        this.props.getData(name);
      };
      
      render() {
        const { requestResult, name } = this.state;
        return (
          <div>
            <form
              id="search_movie"
              className="search-movie"
              onSubmit={this.handleSubmit}
            >
              <input
                type="search"
                value={name}
                onChange={this.handleChange}
                requestvalue={requestResult}
              />
            </form>
            <button
              onClick={this.onOkClick}
            >
              OK
            </button>
          </div>
        );
      }
    }
    
    class Header extends React.Component {
      constructor(props) {
        super(props);
        this.state = { name: "" };  
      }
    
      getData = value => {
        this.setState({ name: value });
        console.log(this.state);
        console.log(value);
      };
    
      render() {
        return (
          <div className="movie-header">
            <div className="container">
              <div>Movie Catalog</div>
              <Searchbox getData={value => this.getData(value)} />
           </div>
          </div>
        );
      }
    }
    
    ReactDOM.render(
      <Header />, 
      document.getElementById('app')
    )
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    <!-- The content rendered into this tag should match the content below. -->
    <div id="app"></div>

    作为答案的补充,我建议您注意您编写的以下代码:

    getData = value => {
      this.setState({ name: value }); 
      console.log(this.state);
      console.log(value);
    };
    

    由于方法setState队列在组件的状态变化,当你console.log(this.state);在调用后显示值时,setState你不会在结果中看到你的值。将setState()其视为请求,而不是立即更新组件的命令。您可以使用回调作为方法中的第二个参数setState来准确获取状态中的设置值,如下所示:

    getData = value => {
      this.setState({ name: value }, () => { console.log(this.state); }); 
      console.log(value);
    };
    
    • 3

相关问题

  • 如果图像在道具中,如何使背景图像做出反应?

  • 项目未显示

  • 引发错误:InvalidTokenError: Invalid token specified: Cannot read property 'replace' of undefined

  • 如何在没有 node.js 的情况下运行 react.js 应用程序

  • 如何从 React Native 中的导航堆栈中清除上一个屏幕?

  • 为什么渲染后会触发 Click 事件?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5