代码之家  ›  专栏  ›  技术社区  ›  Kyle Underhill

将useState设置为compent内部的值

  •  1
  • Kyle Underhill  · 技术社区  · 2 年前

    代码设置 textCount 以匹配输入 onChange ,但我需要 text计数 也设置为来自内部的值 App() 从…起 name .

    import React, { useState } from "react";
    
    function Textarea(props) {
      const [textCount, settextCount] = useState(0);
    
      const recalculate = (e) => {
        settextCount(e.target.value.length);
      };
    
      return (
        <>
          <textarea
            type="text"
            onChange={(e) => {
              recalculate(e);
              props.onChange(e);
            }}
          />
          <p>{textCount}/5</p>
        </>
      );
    }
    export default Textarea;
    
    const App = (props) => {
    const {name} = props.stateData;
      const change = async (e) => {
        props.changevalue(e);
      };
      return (
        <>
          <Textarea value={name} onChange={change} />
        </>
      );
    };
    
    2 回复  |  直到 2 年前
        1
  •  2
  •   m_wer    2 年前

    您可以在Textarea组件中添加一个状态,并将其设置为初始值,还可以初始化相应的计数:

      const [textCount, settextCount] = useState(props.value.length);
      const [textValue, setTextValue] = useState(props.value);
    

    然后使用文本区域内的文本值:

      <textarea
        type="text"
        value={textValue}
        onChange={(e) => {
          recalculate(e);
          props.onChange(e);
          setTextValue(e.target.value)
        }}
      />
    

    如果这就是你想要的,这里有一个作品 sandbox

    编辑:从评论中添加改进的沙盒

    improved version 来自@Leland

        2
  •  0
  •   Benjamin    2 年前

    表单元素上的value属性将覆盖DOM中的值。如果要指定初始值,但不控制后续更新,则可以指定defaultValue属性而不是值。

    <textarea defaultValue={name} onChange={change} />
    
        3
  •  0
  •   Victor Santizo    2 年前

    你不需要有状态 textCount Textarea 组件在任何时候接收到新值时都将被重新渲染,因此我们可以计算 length 的值。

    此外 <p> 标签必须在外部 <textarea> 元素,以及 recalculate() 在这种情况下,函数似乎没有必要,因为我们可以获得 只需阅读 属性的值。

    export default function App() {
      const [textValue, setTextValue] = useState("initialValue");
      return (
        <div className="App">
          <Textarea value={textValue} onChange={setTextValue}/>
        </div>
      );
    }
    
    export function Textarea(props) {
      return (
        <>
          <textarea value={props.value} onChange={(e) => {
            props.onChange(e.target.value)
          }}
          ></textarea>
          <p>textCount: {props.value.length}</p>
        </>
      )
    }