如何在 React 中从事件对象访问自定义属性
介绍
在本指南中,您将学习如何从 React 中的事件对象访问自定义属性。当您必须使用触发器(例如按钮单击或选项选择)从数据源检索自定义值时,这会很有用。
自定义属性
通常,您需要存储与 DOM 元素相关的信息。这些数据可能对于将数据显示到 DOM 来说没什么用,但对开发人员访问其他数据很有帮助。自定义属性允许您将其他值附加到 HTML 元素上。
自定义属性始终以data-开头。例如:
      <ul class="hotels">
  <li data-location="Integer pretium" data-id="78" class="hotel-item">
    Curabitur
  </li>
  <li data-location="Sed pharetra" data-id="122" class="hotel-item">
    Donec aliquet
  </li>
</ul>
    
这里有两个自定义数据属性:location和id。您可以使用这些属性对酒店进行排序或搜索附近的景点,为用户创造互动体验。
元素可以有任意数量的自定义属性,但只能将值解析为字符串。如果要存储整数值,则必须使用 parseInt ()函数将字符串转换为整数。请注意,数据属性名称不能包含大写字母或特殊字符,如“?”、”&”等。
最好不要使用数据属性来存储已经具有适当属性的值。例如:
      <ul data-class="hotels">
  <li data-location="Integer pretium" data-id="78" data-class="hotel-item">
    Curabitur
  </li>
  <li data-location="Sed pharetra" data-id="122" data-class="hotel-item">
    Donec aliquet
  </li>
</ul>
    
最好不要使用data-class之类的属性来存储类名。它会剥夺您使用 DOM 方法进行类操作的权利,并使元素样式变得很麻烦。
在 React 中的使用
假设您正在开发一个电子商务应用程序,并且有一个<Cart />组件。此组件将用于显示用户购物车中的商品。
      class Cart extends Component {
  state = { items: [] };
  async componentDidMount() {
    const items = JSON.parse(localStorage.getItem("cart"));
    this.setState({ items });
  }
  render() {
    return (
      <div className="cart">
        {this.state.items.map(item => (
          <div className="cart-item">
            <span className="item-name">{item.name}</span>
            <button>x</button>
          </div>
        ))}
      </div>
    );
  }
}
    
要在用户点击x按钮时删除项目,请编写一个点击处理程序函数。但您仍需要弄清楚如何识别要删除的项目。为此,请向包含项目id值的按钮元素添加data-remove属性。
      // ...
<div className="cart-item">
  <span className="item-name">{item.name}</span>
  <button onClick={this.removeItem} data-remove={item.id}>
    x
  </button>
</div>
// ...
    
请注意,data-remove是有效的 JSX prop 名称;无需像dataRemove那样使用驼峰式命名。如果您使用驼峰式命名属性名称,JSX 会将其视为 prop 而不是 HTML 自定义属性。
然后,在removeItem()方法中,访问该属性,如下所示。
      // ...
removeItem = e => {
  const removeId = e.target.dataset.remove;
  // logic to remove
  const { items } = this.state;
  for (let i = items.length - 1; i >= 0; --i) {
    if (items[i].id === removeId) items.splice(i, 1);
  }
  this.setState({ items });
  localStorage.setItem("cart", JSON.stringify(items));
};
// ...
    
事件对象的target属性将为您提供原生 DOM 节点。然后,您可以使用任何 DOM API 来访问属性。数据集属性可能在早期版本的 Internet Explorer 中不可用。在这种情况下,您可以使用getAttribute()方法。
      const removeId = e.target.getAttribute("data-remove");
    
getAttribute ()方法将返回指定属性的字符串值。
或者,您也可以使用getNamedItem()方法访问属性。
      const removeId = e.target.attributes.getNamedItem("data-remove").value;
    
结论
向元素添加自定义属性是将附加数据作为元属性传递的好方法。您可以使用 DOM 方法和对象从应用程序中的任何位置访问它们。
这就是本指南的全部内容。希望您今天学到了一些新东西。探索更多这样的主题将帮助您解决和克服编码中的常见问题。
了解更多
探索 Pluralsight 的这些 React 课程以继续学习:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
 
                                 
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                 
                             
                                     
                                     
                                     
                                     
     
    
 
             
   
        
请先 登录后发表评论 ~