使用onClick函数将样式“cursor:pointer”应用于所有React组件

时间:2016-01-08 15:27:04

标签: javascript css reactjs

我想将样式cursor:pointer应用于具有onClick函数的所有React元素。我知道我可以对每个元素都这样做:

<a onClick={handleClick} style={{cursor:'pointer'}}>Click me</a>

或者这个:

<a onClick={handleClick} className="someClassWithCursorPointer">Click me</a>

但我宁愿能够做这样的事情来将风格应用于所有元素:

<style>
 [onclick] {
   cursor: pointer; 
  }
</style>

但是这不起作用,因为在使用React的onclick属性时,元素的呈现HTML中没有实际的onClick属性。

小提琴:https://jsfiddle.net/roj4p1gt/

2 个答案:

答案 0 :(得分:3)

我不确定是否有一种很好的方法可以自动执行此操作而不使用某种拦截React元素的创建并修改它们(或者可能是源级转换)的机制。例如,使用Babel,您可以使用babel-plugin-react-transform并使用className道具添加onClick使用这些行中的内容(警告:伪代码):

export default function addClassNamesToOnClickElements() {
  return function wrap(ReactClass) {
    const originalRender = ReactClass.prototype.render;

    ReactClass.prototype.render = function render() {
      var element = originalRender.apply(this, arguments);
      return addClickClassNamesToApplicableElements(element);
    }

    return ReactClass;
  }
}

function addClassNamesToApplicableElements(elem) {
  if (!elem || typeof elem === "string") return elem;

  const children = elem.children;
  const modifiedChildren = elem.props.children.map(addClassNamesToApplicableElements);

  if (elem.props.onClick) {
    const className = elem.props.className || "";

    return {
      ...elem,
      props: {
        ...elem.props,
        className: (className + " hasOnClick").trim(),
        children: modifiedChildren
      }
    };
  } else {
    return {
      ...elem,
      props: {
        ...elem.props,
        children: modifiedChildren
      }
    }
  };
}
第二部分工作的{p> Here's a quick examplehttps://bit.ly/1kSFcsg

答案 1 :(得分:-4)

您可以使用css轻松完成此操作:

a:hover {
 cursor:pointer;
}