javascript - 在 React 中如何将 onClick 函数传递给孙组件?

标签 javascript reactjs

我刚刚开始使用 React,根据我的案例改编井字游戏教程。 我试图单击孙组件来更改祖 parent 组件的状态。代码如下:

class App extends React.Component {
  
  constructor(props) {
    super(props);
    this.state = {
      fields: [
        {
          id: 1,
          show: false
        },
        {
          id: 2,
          show: false
        }
      ]
    }
  }

  handleClick(i) {
    const fields = this.state.fields.slice();
    fields[i].show = true;
    this.setState({fields: fields});
  }
  
  render() {return <Preview />}
      
}

const Preview = (props) => {
  
  return (
    <div className="preview">
      {props.fields.map((field) => (
        <Field data={field} key={field.id} onClick={ props.onClick(field.id) }/>
      ))}
    </div>
  );
};

const Field = props => {
  
  return (
    <div className="field" onClick={ props.onClick } />
  );
};

我收到 TypeError: Cannot read property 'state' of undefined from this line:

handleClick(i) {
const fields = this.state.fields.slice();

最佳答案

问题

    App 类的
  1. this 未绑定(bind)到 handleClick 函数。这是 TypeError: Cannot read property 'state' of undefined 错误的原因。
  2. 您正在改变您的状态对象。对数组进行切片会创建一个新的数组引用,但 fields[i].show = true; 会改变状态中的对象引用。
  3. 您不会将 fieldsonClick 属性传递给 Preview
  4. Preview 中未正确调用 onClick 回调。

解决方案

  1. this 绑定(bind)到处理程序或转换为箭头函数,以便自动绑定(bind)。

    constructor(props){
      ...
      this.handleClick = this.handleClick.bind(this);
    }
    

    handleClick = (i) => { ..... };
    
  2. 不要改变状态。浅复制状态然后更新属性。

    handleClick = (id) => {
      this.setState(prevState => ({
        fields: prevState.fields.map((field) => {
          return field.id === id ? {
            ...field,
            show: true,
          } : field;
        }),
      }));
    };
    
  3. fieldshandleClick 作为 onClick 传递给 Preview

    render() {
      return (
        <Preview
          fields={this.state.fields}
          onClick={this.handleClick}
        />
      );
    }
    
  4. 使用 ID 正确调用 props.onClick

    {props.fields.map((field) => (
      <Field
        data={field}
        key={field.id}
        onClick={() => props.onClick(field.id)}
      />
    ))}
    

关于javascript - 在 React 中如何将 onClick 函数传递给孙组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67431662/

相关文章:

javascript - React 中的在线示例(立方体的 CSS)

reactjs - Ant Design for React Native 真正的原生组件?

php - 使用 POST 通过 AJAX 将 HTML 表格行传递给 PHP

javascript - Jquery 适用于一个域,不适用于另一个域 - 使用*相同的*代码

reactjs - 在react-select v2 中使用 Font Awesome 图标?

javascript - 为什么我的 reactContext 变量仍然为空?

javascript - 从后端提取列表后,如何有条件地在列名中呈现?

javascript - selenium 中是否有任何方法可以查找我们必须查找的元素的标签类型

javascript - 如何通过值获取枚举名称?

javascript - 替换刮掉的文本