【问题标题】:Creating anchor with onClick that React handles使用 React 处理的 onClick 创建锚点
【发布时间】:2018-06-02 11:45:14
【问题描述】:

我有一个 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 not defined。我尝试使用 this.clickMenu 代替,但没有任何反应。我注意到渲染的锚看起来像:

<a onclick="{menuClick}">

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

【问题讨论】:

  • 为什么不从generateLinks 中取出clickMenu 并使其成为自己的原型元素呢?然后您可以将其用作this.clickMenu
  • 我正在尝试生成一个在单击时调用 this.clickMenu 的锚。 clickMenu 我相信这意味着它是一个原型元素。我无法弄清楚原型元素到底是什么。
  • 抱歉措辞令人困惑。我想尽可能的技术。当我说原型元素时,我的意思是“类方法”。 JavaScript 没有真正的类,因此这样称呼它从根本上说是不正确的。

标签: javascript reactjs onclick anchor react-class-based-component


【解决方案1】:

使用 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>;
  }
}

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

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

【讨论】:

  • 您可能希望在组件方法声明中使用箭头函数,这样您就无需为这些方法绑定this。例如:clickMenu = (id) =&gt; {,并删除去this.clickMenu = this.clickMenu.bind(this); 的行。 Live example here。到目前为止我找到的最好的解释是 in the TypeScript docs,但它通常适用于 ES6 类,不仅适用于 TypeScript(请参阅“修复”部分中的“使用实例函数”段落)。
  • @aurelienshz 是的,但我的回答主要是关于实现一个列表,而不是关于 this 所指的上下文。我不想把它变成 React 入门 ;)
  • 好的,确实有效。我很欣赏这种努力。没有考虑在渲染方法中组装响应。现代 JavaScript 越来越具有挑战性。 @aurelienshz 今天早些时候我了解了 bind(this) 链。 chris g:我看到了拼写错误,这段代码是从实际代码中推断出来的,以说明我遇到的具体挑战。
  • 您不要构建摇摇欲坠的 HTML 字符串的警告很严厉,但对我很有帮助。离开 ReactJS 路径并进入奇怪的点击处理模式的兔子洞是可能的。但最好留在人多的路上。我最终把我的链接放到了一个完全独立的 React 组件中。
猜你喜欢
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多