道具在 React 中未定义

Props are undefined in React

我是 jsreactjs 的新手。我正在尝试创建一个 ButtonGroup,里面只有几个 Buttons,希望当我单击特定的 Button(在 ButtonGroup 中)时,只有那个特定的按钮会突出显示(改变颜色)和休息将是正常的颜色。 下面是执行上述行为的代码,但在 setColour 方法中我收到错误 _this.state.selected.props is undefined。有人可以指出我哪里出错了吗?另外,如果有人可以告诉我这是否是解决此问题的正确方法。

import React from "react"
import {
    ButtonGroup,
    Button
} from "reactstrap"


class MainButtonsGroup extends React.Component {
constructor (props) {
    super(props)
    this.state = {
        selected: null
    }
}

handleSelection = (e) => {
    this.setState({selected: e.target})
}

setColour = (key) => {
    if (this.state.selected)
    {
        // ERROR : _this.state.selected.props is undefined
        return (this.state.selected.props.key === key) ? 'primary' : 'secondary'
    }
}

render() {
    return (
        <ButtonGroup>
            <Button key={1} onClick={this.handleSelection} color={this.setColour(1)}>MainButtonA</Button>
            <Button key={2} onClick={this.handleSelection} color={this.setColour(2)}>MainButtonB</Button>
            <Button key={3} onClick={this.handleSelection} color={this.setColour(3)}>MainButtonC</Button>
        </ButtonGroup>
    )
}
}

export default MainButtonsGroup;

你不应该坚持 e.target 参考,你一定会在你的控制台中收到关于它的 React 警告?您刚刚在您的应用程序中造成了内存泄漏。

而是从目标中复制您需要的内容,并让引用被垃圾回收。尽管在您的情况下不需要将数据附加到 DOM 节点:

<Button onClick={() => this.handleSelection(this.setColour(3))}>MainButtonC</Button>

请注意,除非您在循环中映射元素,否则不需要 key={3}

handleSelection = (color) => {
    this.setState({ selected: color })
}

然而这段代码有点奇怪,只是记录点击按钮的索引并给它一个 class 来设置它的样式,例如

class MainButtonsGroup extends React.Component {
  state = {
    selectedIndex: null,
  }

  handleSelection = (index) => {
    this.setState({selectedIndex: index})
  }

  render() {
    const idx = this.state.selectedIndex;

    return (
      <ButtonGroup>
        <Button className={idx === 1 ? 'primary' : 'secondary'} onClick={() => this.handleSelection(1)}>MainButtonA</Button>
        <Button className={idx === 2 ? 'primary' : 'secondary'} onClick={() => this.handleSelection(2)}>MainButtonB</Button>
        <Button className={idx === 3 ? 'primary' : 'secondary'} onClick={() => this.handleSelection(3)}>MainButtonC</Button>
      </ButtonGroup>
    );
  }
}

您无法从 DOM 节点获取组件的 props。您可以改为将按钮名称保存在组件状态的数组中,并使用它在渲染方法中渲染按钮。

然后您可以将按钮名称传递给 handleSelection 并将其用作您的 selected 值。如果您的按钮是选中的按钮,则可以为它指定 primary 颜色,否则为 secondary 颜色。

例子

import React from "react";
import ReactDOM from "react-dom";
import { ButtonGroup, Button } from "reactstrap";
import "bootstrap/dist/css/bootstrap.min.css";

class MainButtonsGroup extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      buttons: ["A", "B", "C"],
      selected: null
    };
  }

  handleSelection = button => {
    this.setState({ selected: button });
  };

  render() {
    const { buttons, selected } = this.state;

    return (
      <ButtonGroup>
        {buttons.map(button => (
          <Button
            key={button}
            onClick={() => this.handleSelection(button)}
            color={selected === button ? "primary" : "secondary"}
          >
            MainButton{button}
          </Button>
        ))}
      </ButtonGroup>
    );
  }
}