javascript - 无法读取 null 的属性 'innerHTML'

标签 javascript html css reactjs

尝试在我的关于类中创建一个简单的文本效果。我正在使用 React 来做这件事。它一直告诉我它无法读取属性 innerHTML。

我在想它看不到渲染中的元素,这就是为什么它认为它是空的。我该如何解决?

class About extends Component
{
  constructor(props){
    super(props)
    this.loading = this.loading.bind(this)
  }

  loading() {
    console.log('i got here')
    let i = 0;
    let txt = this.props.text;
    let speed = 50;
    function typeWriter() {
      if ( i < txt.length){
        document.getElementById("welcome").innerHTML += txt.charAt(i);
        i++;
        setTimeout(typeWriter,speed);
      }
    }
    typeWriter()
  }


    render()
    {
        return(
            <div className="about">
            <h1 id="welcome" onload = {this.loading()}></h1>
            <p>some text</p>
            </div>
        );
    }
}

我只是想将 Welcome 中的文本逐个字符地显示出来,有点像打字效果。

最佳答案

您应该使用 state 或 refs。然后在 componentDidMount 上运行你的函数,而不是使用 onload 函数。因此,对于 refs,它看起来像下面这样:

class About extends Component {
  constructor(props) {
    super(props);
    this.loading = this.loading.bind(this);
    this.elRef = React.createRef();
  }

  componentDidMount() {
    this.loading();
  }

  loading() {
    const el = this.elRef.current;
    let i = 0;
    let txt = 'Hello';
    let speed = 50;
    function typeWriter() {
      if (i < txt.length) {
        el.innerHTML += txt.charAt(i);
        i++;
        setTimeout(typeWriter, speed);
      }
    }
    typeWriter();
  }

  render() {
    return (
      <div className="about">
        <h1 ref={this.elRef} />
        <p>some text</p>
      </div>
    );
  }
}

Dom 操作在 React 中有点棘手,因为它使用虚拟 DOM。因此,当您尝试操作它时,大多数时候该元素尚未呈现给实际的 DOM。因此,在操作 DOM 元素时,您需要使用 react refs React Refs或者您可以将您的值设置为状态。但在您的情况下,每次弹出一个字母时都会触发重新渲染,因此 refs 可能是您情况的最佳选择。

关于javascript - 无法读取 null 的属性 'innerHTML',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56080370/

相关文章:

javascript - 使用 jsignature 降低 mousedown 灵敏度

javascript - 通过循环创建的错误元素上的 jQuery 单击事件

javascript - 如何在 saga 中解决第一个操作后执行操作?

php - 如何将文本区域中的每个项目添加到我的数据库中?

html - 如何将纯 css 工具提示添加到 svg 中的一类路径

ios - 滚动在 iPhone 上不起作用

javascript - 用jquery交替颜色?

html - 如何将 fontawesome 图标对齐到一条线的中间(已经尝试过现有的解决方案)

javascript - 下划线js扩展方法

html - Firefox adblock 阻止了我的 CSS 样式