【问题标题】:createRef not working properly in react stateless componentcreateRef 在反应无状态组件中无法正常工作
【发布时间】:2018-05-09 01:55:01
【问题描述】:

下面的代码抛出一个类型错误:'Cannot read property "focus" of null'。离开反应的文档,这应该可行。 注意:父组件实现了redux connect方法,但我不确定为什么这会对这个组件产生任何影响。

import React, { Component, createRef } from 'react';
import './Card.scss';

const Card = ({isEditing, item, onBlur, onChange}) => {
  let inputText = createRef();

  const editing = (editMode) => {
    if (editMode) {
      inputText.current.focus();
    }

    return e => {
      e.stopPropagation();
      isEditing(item, editMode);
    };
  }

  const update = () => {
    return e => {
      onChange(item.id, e.target.value);
    }
  }

  return (
    <div className="card">
      <img className="card-image" src="https://picsum.photos/200/200" 
        alt="no image display" />
      <div className="card-body">
        {item.edited ? (
          <div>
            <input type="text" ref={inputText} onClick={e => 
            e.stopPropagation()} value={item.name} onBlur= 
            {editing(false)} 
            onChange= 
            {update()} />
        </div>
      ) : (
        <h3 className="card-title" onClick={editing(true)} >
          {item.name}
        </h3>
      )}
      </div>
    </div>
   );
  }

export default Card;

【问题讨论】:

标签: reactjs


【解决方案1】:

请按照here 的说明使用useRef

此函数创建在功能组件生命周期期间处于活动状态的可变对象。

【讨论】:

    【解决方案2】:

    问题可能是这一行:

    <h3 className="card-title" onClick={editing(true)} >
    

    你想要做的可能是onClick={() =&gt; {editing(true)}}

    并且由于您设置 ref 的第一个 input 最初并未呈现,因此永远不会设置 current

    【讨论】:

    • 文档说你不能将 refs 分配给功能组件,并不是说你不能在它们内部使用。
    • 为了进一步了解@Dane 添加的内容,您可以使用 forwardRef 在功能组件上使用 ref
    猜你喜欢
    • 2020-02-28
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多