小能豆

React 将函数传递给子组件

javascript

我想将一个函数传递给子组件但出现了这个错误。

Invalid value for prop passedFunction on <div> tag.
class Parent extends Component {
    passedFunction(){}
    render() {
      <Child passedFunction={this.passedFunction}/>
    }
}

class Child extends Component {
    render() {
        <div onClick={this.props.passedFunction}></div>
    }
}

基本上这就是我想做的事情。

var ReactGridLayout = require(’react-grid-layout’);

var MyFirstGrid = React.createClass({
passedFunction:function(){}
  render: function () {
    return (
      <ReactGridLayout className="layout" cols={12} rowHeight={30} width={1200}>
        <div key="a" data-grid={{x: 0, y: 0, w: 1, h: 2, static: true}}>a</div>
        <div key="b" data-grid={{x: 1, y: 0, w: 3, h: 2, minW: 2, maxW: 4}}>b</div>
        <div key="c" data-grid={{x: 4, y: 0, w: 1, h: 2}} passedFunction={this.passedFunction}>c</div>
      </ReactGridLayout>
    )
  }
});

它似乎是在 React v16 中引入的。因此,将函数从父级传递到子级的正确方法是什么?


阅读 37

收藏
2024-06-15

共1个答案

小能豆

在 React 中,你可以通过 props 将函数从父组件传递到子组件。你遇到的错误是因为你尝试在 div 元素上直接传递自定义的 passedFunction 属性,而 div 元素不接受该属性。你需要将该函数传递给自定义组件,并确保只在自定义组件中处理它。

以下是如何修正你代码的正确示例:

Parent Component

class Parent extends React.Component {
  passedFunction() {
    console.log("Function called!");
  }

  render() {
    return (
      <Child passedFunction={this.passedFunction}/>
    );
  }
}

Child Component

class Child extends React.Component {
  render() {
    return (
      <div onClick={this.props.passedFunction}>
        Click me to call passed function
      </div>
    );
  }
}

使用 ReactGridLayout 的例子

对于你的 ReactGridLayout 示例,你需要确保将 passedFunction 传递给自定义组件,而不是直接传递给 div 元素。你可以创建一个自定义的子组件来处理 passedFunction

自定义子组件

const CustomGridItem = ({ dataGrid, passedFunction, children }) => (
  <div data-grid={dataGrid} onClick={passedFunction}>
    {children}
  </div>
);

使用 ReactGridLayout 的主组件

import React from 'react';
import ReactGridLayout from 'react-grid-layout';

const MyFirstGrid = React.createClass({
  passedFunction: function() {
    console.log("Grid item clicked!");
  },

  render: function () {
    return (
      <ReactGridLayout className="layout" cols={12} rowHeight={30} width={1200}>
        <div key="a" data-grid={{x: 0, y: 0, w: 1, h: 2, static: true}}>a</div>
        <div key="b" data-grid={{x: 1, y: 0, w: 3, h: 2, minW: 2, maxW: 4}}>b</div>
        <CustomGridItem key="c" data-grid={{x: 4, y: 0, w: 1, h: 2}} passedFunction={this.passedFunction}>
          c
        </CustomGridItem>
      </ReactGridLayout>
    );
  }
});

export default MyFirstGrid;

解释

  • Parent Component: 在 Parent 组件中,passedFunction 函数被定义并通过 props 传递给 Child 组件。
  • Child Component: 在 Child 组件中,passedFunction 被绑定到 divonClick 事件处理程序中。
  • CustomGridItem Component: 自定义的 CustomGridItem 组件处理 passedFunctiondata-grid 属性,并将 onClick 事件处理程序绑定到 div 元素上。
  • MyFirstGrid Component: 在 ReactGridLayout 组件中,使用自定义的 CustomGridItem 组件,并将 passedFunction 传递给它。

这样可以确保 passedFunction 被正确传递和调用,而不会引起不必要的错误。

2024-06-15