【问题标题】:React TS - Max character limit for textareaReact TS - textarea 的最大字符数限制
【发布时间】:2020-03-09 19:13:08
【问题描述】:

所以我有 2 个问题。我创建了一个 textarea 组件,该组件还将跟踪用户在 textarea 中输入了多少字符。

问题 1: 我正在尝试查看用户输入的当前输入长度是否大于或等于(>=)我的maxLength prop if (value.length >= maxLength),但我收到此错误:

var maxLength: number | undefined
Object is possibly 'undefined'.ts(2532)

谁能解释我为什么会得到这个?

问题 2: 目前,当您在 textarea 中键入单个字符时,字符限制将保持在 0,并且仅在键入第二个字符后才会开始增加。此外,如果您在 textatea 中键入一些文本然后删除它,它会说字符限制是 1/X,而它应该是 0/X。我该如何解决这个问题?

代码:

import * as React from "react";
import "./styles.css";

interface ITextarea {
  maxLength?: number;
}

const Textarea: React.FC<ITextarea> = ({ maxLength }) => {
  const [value, setValue] = React.useState("");
  const [charLimit, setCharLimit] = React.useState(`0 / ${maxLength}`);

  const handleCharLimit = () => {
    if (value.length >= maxLength) {
      setCharLimit("You have reached the maximum number of characters!");
    } else {
      setCharLimit(`${value.length} / ${maxLength}`);
    }
  };

  return (
    <>
      <textarea
        value={value}
        onChange={event => {
          setValue(event.target.value);
          handleCharLimit();
        }}
        maxLength={maxLength}
      />
      {maxLength && <span>{charLimit}</span>}
    </>
  );
};

export default function App() {
  return (
    <div className="App">
      <Textarea maxLength={50} />
    </div>
  );
}

这是一个CodeSandBox,感谢分叉 :)

【问题讨论】:

    标签: javascript reactjs typescript


    【解决方案1】:
    1. 对象可能是'未定义'.ts(2532)

    ITextareamaxLength 定义为可选参数。如果你不为它传递一个值,它的值将是未定义的。

    1. 发生这种情况是因为 React 状态更新不是立即的,它们发生在下一次渲染过程中。您正在调用handleCharLimit,但是当您调用它时,value 实际上还没有更新,即使它是在setValue 之后调用的。您应该使用useEffectuseMemo 来更新您的charLimit 以响应value 的变化。

    在此处查看更新版本:https://codesandbox.io/s/hungry-fermi-bsmny

    【讨论】:

    • 您好,非常感谢您的快速响应。我认为您可能粘贴了错误的沙盒链接?
    • 好的,谢谢! :) 总的来说,我仍在学习 React Hooks 和 React,但这非常有效,我需要进一步阅读以更详细地了解它是如何工作的。我注意到maxLength 仍然是一个可选参数 - 为什么在你的 fork 中不再出现这个错误?
    • 我通过检查if(maxLength) { ... }React.useMemo 回调中保护它。这让 Typescript 知道 if 语句内部的使用范围缩小到 maxLength 未定义的情况,因此它不会抱怨。 useMemo 有点像 useEffect + useState - 该函数仅在依赖项数组更改时运行。这使其成为此类依赖值的理想选择。
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 2012-07-28
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多