【问题标题】:React - child to parent callback not workingReact - 子到父回调不起作用
【发布时间】:2019-06-17 16:57:00
【问题描述】:

以前成功的从子组件向父组件发送数据的回调方法在这个新项目中不起作用。

我正在开发一个 React 网络应用程序。有一个名为 Flags.js 的组件。它包含美国州旗和一个 targetFlag 州。 Flags 组件正确加载,但不会将该 targetFlag 选择发送到 App.js。我之前询问过孩子与父母的沟通,并得到了另一个项目的有效答案:React communication problem from child to parent。我尝试将该逻辑应用于此应用程序,但没有成功。

Github:https://github.com/irene-rojas/us-flags

App.js

import React, { Component } from 'react';
import './App.css';
import SVGMap from "./components/Map/Map.js";
import Flags from "./components/Flags/Flags";


class App extends Component {

state = {
    correct: 0,
    wrong: 0,
    targetFlag: "",
    selectedState: ""
}

onClick = (event) => {
    event.preventDefault();
    let clickedState = event.target.id;
    this.setState({
        selectedState: clickedState
    });  
    if (clickedState === this.state.selectedState) {
        this.setState({correct: this.state.correct + 1}, () => {
            console.log("correct");
            this.getFlag();
        });
    };
    if (clickedState === !this.state.selectedState) {
        this.setState({wrong: this.state.wrong + 1}, () => {
            console.log("wrong");
            this.getFlag();
        });
    }
}

getFlag = (targetFlag) => {
    this.setState({
        targetFlag: targetFlag.id
    });
    console.log(`App.js: ${this.state.targetFlag}`)
}


  render() {
    return (
  <div className="App">

    <div className="header">
        <h1>Match the Flag</h1>
    </div>

    <div className="flagsDiv">
        <Flags 
            sendFlag={this.getFlag}
        />
    </div>

    <div className="mapDiv">
        <SVGMap 
            onClick={this.onClick}
        />
    </div>

    <div className="scoreDiv">
        Correct: {this.state.correct}
        <br></br>
        Wrong: {this.state.wrong}
        <br></br>
        Target State: {this.state.targetFlag}
        <br></br>
        Selected State: {this.state.selectedState}
    </div>

  </div>
    );
  }
}

export default App;

标志.js

import React, { Component } from 'react';
import "./Flags.css";
import alabama from "./images/Alabama.png";
import alaska from "./images/Alaska.png";
--- 48 more states in this import format ---

class Flags extends Component {

state = {
    flags: [
        {name: "Alaska", src: alaska, id: "AK"},
        {name: "Hawaii", src: hawaii, id: "HI"},
--- 48 more states in this state format ---
    targetFlag: [
        {name: "", src: "", id: ""}
    ],
};

componentDidMount() {
    let targetFlag = this.state.flags[Math.floor(Math.random()*this.state.flags.length)];
        this.setState({
            name: targetFlag.name,
            src: targetFlag.src,
            id: targetFlag.id
        });
        // console.log(`Flags.js: ${targetFlag.name}`);
}

sendFlag = (targetFlag) => {
    this.props.sendFlag(targetFlag);
}  


render() {
    return (

    <div>
        <img  
            src={this.state.src} 
            alt={this.state.id}
            onLoad={this.sendFlag}
        />
        <br></br>
        {this.state.name}
    </div>

    )
    }
}

export default Flags;

我希望将 Flags.js 中选择的 targetFlag 值转移到 App.js。如果代码有其他问题,请告诉我。

【问题讨论】:

    标签: javascript reactjs ecmascript-6


    【解决方案1】:

    我提取了你的 github 仓库, 你应该注意到 setstate 是异步的,所以你应该使用回调函数

    //App.js line 36
    //notice the targetFlag.target.id and setstate callback function
    getFlag = (targetFlag) => {
            this.setState({
                targetFlag: targetFlag.target.id
            }, ()=>{
                console.log(`App.js: ${this.state.targetFlag}`)
            });
    
        }
    
    //Flags.js line 133
    //notice the addition of id attribute
    <img  
      src={this.state.src} 
      alt={this.state.id}
      onLoad={this.sendFlag}
      id={this.state.id}
     />
    

    【讨论】:

    • 谢谢,这成功了! targetState 现在出现了。虽然游戏逻辑仍然无法正常工作。我将 this.getFlag() 移出 setState。 onClick = (event) => { event.preventDefault();让 clickedState = event.target.id; this.setState({ selectedState: clickedState }); if (clickedState === this.state.selectedState) { this.setState({correct: this.state.correct + 1}, () => { console.log("correct"); }); this.getFlag(); }; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2017-12-15
    相关资源
    最近更新 更多