javascript - 将点击事件传递给嵌套组件 - React | Material -UI

标签 javascript reactjs material-ui

我有问题。当您单击 listItem(整个分离的 li 元素)时,我想在 listItem 的复选框组件上调用 onChange 函数>。

我可以轻松地将该函数从复选框移动到父级,但我会松开 checked 属性。

选中复选框本身不起作用,但只需打开控制台即可查看结果。我希望 handleToggle 函数在单击整个元素时正确触发(不仅是复选框)

  <List>
    {['first', 'second', 'third'].map((name, i) => (
      <ListItem key={i} dense button>
        <ListItemText primary={name} />
        <Checkbox
          disableRipple
          checked={false}
          onChange={(evt, checked) => this.handleToggle(evt, checked, name)}
        />
      </ListItem>
    ))}
  </List>

Code SandBox

编辑

我根本不想在这个组件中使用状态。总结 - 如何将事件从 ListItem(父级)传递给它的子级(Checkbox)?

最终编辑:我找到了处理它的方法。不需要状态。只需两行简单的代码。

由于复选框状态完全由 redux 控制,我只是将 onClick 函数移动到 ListItem 元素,其中一行代码在其正文中:

...dispatch(toggle(!this.props.elements[nameOfElement], name));

无论如何,感谢大家的帮助。赞成每个答案。

最佳答案

Roby,我也打败了它,但我处理状态变化的方式略有不同。

想法是管理父状态中所有复选框的状态(未选中)。然后您在父级中有一个 handleToggle 函数,它将使用所有复选框的选中值更新父级状态。

此状态然后作为 Prop 传递给每个复选框。

此外,将 map 中的索引用作 ListItem 中的键也不是一个好主意。如果您在列表中添加和删除项目,React 会混淆哪个项目是哪个。

代码如下:

从“react”导入 React;

import { render } from "react-dom";
import Hello from "./Hello";

import List, {
  ListItem,
  ListItemSecondaryAction,
  ListItemText
} from "material-ui/List";
import Checkbox from "material-ui/Checkbox";

const styles = {
  fontFamily: "sans-serif",
  textAlign: "center"
};

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      list: [],
      listChecked: []
    };
  }

  componentWillMount() {
    this.setState({
      list: ["first", "second", "third"],
      listChecked: [{ first: false }, { second: false }, { third: false }]
    });
  }

  handleToggle = evt => {
    console.log(evt.target.checked);
    const name = evt.target.name;
    this.setState({ name: !this.state.listChecked[name]})
    // this.props.dispatch(x(checked, name));
  };

  render() {
    const { list } = this.state;
    return (
      <List>
        {list.map((name, i) => (
          <ListItem key={name} dense button>
            <ListItemText primary={name} />
            <Checkbox
              disableRipple
              checked={this.state.listChecked[name]}
              onChange={this.handleToggle}
            />
          </ListItem>
        ))}
      </List>
    );
  }
}

render(<App />, document.getElementById("root"));

CodeSandbox Example

关于javascript - 将点击事件传递给嵌套组件 - React | Material -UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47608511/

相关文章:

javascript - 新行上的多行文本区域

javascript - 滚动类型 ="number"输入以更改其值 : How to stop parent's scrolling

reactjs - react : Trouble implementing Redux with React-router

reactjs - TS2339 (TS) 类型上不存在属性 'state'

reactjs - Material UI Switch 切换有错误,无法正确更改

javascript - Material-UI 上的样式 : Undefined CSS fields

javascript - 所有列都更新了 Angular 2

javascript - 弹出窗口关闭后调用javascript函数

javascript - 如何等待下一个POST请求

gulp - 为什么 "gulp-jest"失败并显示 : "Please run node with the --harmony flag!"?