是否可以将`ref`用于TextNode?

时间:2017-08-12 22:17:03

标签: javascript html reactjs dom jsx

这:

import React from "react";
import { render } from "react-dom";

let $container;

render(
  <b ref={e => ($container = e)}>
    {"one"}two{"six"}
  </b>,
  document.getElementById("root")
);

console.log($container);

会给我<b>元素:

<b>
  <!-- react-text: 2 -->
  "one"
  <!-- /react-text -->
  <!-- react-text: 3 -->
  "two"
  <!-- /react-text -->
  <!-- react-text: 4 -->
  "six"
  <!-- /react-text -->
</b>

但是,如果我想要引用其中一个TextNodes,该怎么办? 这是公开的api吗?也许是TextNodes的特殊type所以我可以将道具传递给createElement

2 个答案:

答案 0 :(得分:0)

不,你不能使用JSX对这些字符串文字进行引用。这段代码转化为:

render(React.createElement(
  "b",
  { ref: function ref(e) {
      return $container = e;
    } },
  "one",
  "two",
  "six"
), document.getElementById("root"));

它们不是React元素而是字符串,您可以使用Babel Repl进行检查。解决此问题的一种方法是将这些元素包装在<span>标记中,这样就可以附加引用。

$refs = {};

render(
  <b>
    <span ref={e => $refs.one = e}>one</span>
    <span ref={e => $refs.two = e}>{'two'}</span>
    <span ref={e => $refs.three = e}>three</span>
  </b>,
  document.getElementById("root")
);

答案 1 :(得分:0)

这就是我所做的:我创建了一个仅由文本组成的组件,并在DOM中使用TextNode引用其ReactDOM.findDOMNode,如下所示:

class TextNode extends React.Component {

  componentDidMount() {
      this.textNode = ReactDOM.findDOMNode(this); // Will be the DOM text node
  }

  render() {
    return this.props.text;
  }

}

在你的例子中,我可以这样做:

render(
  <b>
    <TextNode text={"one"} />
    <TextNode text="two" />
    <TextNode text={"six"} />
  </b>,
  document.getElementById("root")
);

生成的HTML不会有任何span s:

<b>onetwosix</b>

虽然DOM会有一个<b>元素,里面有3个文本节点。