【问题标题】:How do I reuse a method to handle multiple, different refs in React?如何重用一个方法来处理 React 中的多个不同的 refs?
【发布时间】:2018-07-18 14:25:21
【问题描述】:

我正在使用 jQuery 对 React 应用程序进行一些 UI 操作。 (我知道,我知道... :)

为什么我需要编写不同的方法(行为相同)来切换导航栏的不同部分?

首先,我尝试创建 一个方法并将其传递给 both 下面的点击侦听器,只有 first ref 会切换,无论是否点击两个元素都在监听点击事件。

现在,我让它工作了,但使用两个 diff 方法做完全相同的事情。

这似乎远非 DRY 方法。

我错过了什么吗?

import React, { Component } from 'react';
import { findDOMNode } from 'react-dom';
import $ from 'jquery';

class Navigation extends Component {
  componentDidMount() {
    this.$el = $(this.el);
    this.$el.slideToggle();
  }

  componentWillUnmount() {
    this.$el.slideToggle('destroy');
  }

  //handle first dropdown
  portifolioDropdownToggle = () => {
    const el = findDOMNode(this.refs.ptoggle);
    $(el).slideToggle();
  }
  //handle second dropdown 
  servicesDropdownToggle = () => {
    const el = findDOMNode(this.refs.servtoggle);
    $(el).slideToggle();
  }

  render() {
    return (
          <div>
          <nav>
            <ul className="nav-list" >
              <li><a href="#!">Home</a></li>
              <li><a href="#!">About</a></li>
              {/* First Dropdown */}
              <li>
                <a href="#!" onClick={this.servicesDropdownToggle}>Services</a>
                <ul className="nav-dropdown" ref="servtoggle">
                  <li>
                    <a href="#!">Web Design</a>
                  </li>
                  <li>
                    <a href="#!">Web Development</a>
                  </li>
                </ul>
              </li>
              {/* Second Dropdown */}
              <li><a href="#!">Pricing</a></li>
              <li>
                <a href="#!" onClick={this.portifolioDropdownToggle}>Portfolio</a>
                <ul className="nav-dropdown" ref="ptoggle">
                  <li>
                    <a href="#!">Web Design</a>
                  </li>
                  <li>
                    <a href="#!">Web Development</a>
                  </li>
                </ul>
              </li>
            </ul>
          </nav>
        </div>
    )
  }

}

export default Navigation;

【问题讨论】:

  • 我刚刚登陆这个线程谷歌搜索完全相同的东西。很想知道这里的最佳做法是什么……

标签: javascript jquery reactjs ecmascript-6


【解决方案1】:

如果您将标识符作为参数传递给方法,那么您可以重用它。

handleToggle = (thingToToggle) => {
    const el = findDOMNode(thingToToggle);
    $(el).slideToggle();
  }

然后在你的渲染方法中,你可以像这样使用它......

 <a href="#!" onClick={() => this.handleToggle(this.refs.ptoggle)}>Portfolio</a>

并像这样重复使用它......

<a href="#!" onClick={() => this.handleToggle(this.refs.servtoggle)}>Services</a>

【讨论】:

  • 根据您的建议,我得到以下信息:警告:导航正在其 render() 中访问 findDOMNode。 render() 应该是 props 和 state 的纯函数。它永远不应该访问需要来自先前渲染的陈旧数据的东西,例如 refs。将此逻辑移至 componentDidMount 和 componentDidUpdate。
  • 没关系。我忘了在 onClick 之前添加 () =>。非常感谢!
猜你喜欢
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2019-06-20
  • 2017-02-07
  • 2016-09-13
相关资源
最近更新 更多