使用React处理的onClick创建锚点

问题描述 投票:0回答:1

我有一个React组件,它呈现<ul>并根据状态插入<li>元素。

class SimpleComponent extends React.Component {
  constructor(props) {
    this.state = { menu_items: [name: "First", id: 10] }
    this.clickMenu = this.clickMenu.bind(this)
  }
  generateLinks() {
    let to_return='';
    for (var i=0;i<this.state.menu_items.length; i++) {
      to_return = to_return + `<li><a onclick={clickMenu}> ${this.state.menu_item[i]['name']} </a></li>`
     }
     return to_return;
   }
   clickMenu(e) {
     console.log(e.target)
   }
   render() {
     return(
       <ul dangerouslySetInnerHTML={this.generateLinks()}></ul>
     )
   }
}

当我单击Anchor时,控制台会指示Uncaught ReferenceError:clickMenu未定义。我尝试过使用this.clickMenu,但没有发生任何事情。我注意到渲染的锚看起来像:

<a onclick="{menuClick}">

有没有办法创建这些锚元素让React获取onClick定义而不是将它们传递给浏览器来解释?

javascript reactjs
1个回答
4
投票

使用React,您应该构建组件和子组件,而不是组成长HTML字符串。你基本上正在破坏React的使用模式,这正是你使用的属性包含“危险”这个词的原因。

以下是如何实现该列表的一种方法:

class SimpleComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { menu_items: [{ name: "First", id: 10 }] };
    this.clickMenu = this.clickMenu.bind(this);
  }
  clickMenu(id) {
    console.log(id);
  }
  render() {
    var items = this.state.menu_items.map(item => {
      let handleClick = () => {
        this.clickMenu(item.id);
      };
      return (
        <li key={item.id}>
          <a onClick={handleClick}>
            {item.name}
          </a>
        </li>
      );
    });
    return <ul>{items}</ul>;
  }
}

我正在通过映射<li>构建一个state.menu_items元素数组。由于组件在状态发生变化时重新渲染,因此将始终根据当前的state进行更新(并且只进行实际需要的更改,这是React的定义特征之一)。

另请注意,您的构造函数缺少super(props)调用,并且您的状态数组的单个元素未包含在花括号中。

© www.soinside.com 2019 - 2024. All rights reserved.