<p> 元素可见性的 ReactJS 问题

ReactJS problem with <p> element visibility

我有 3 个输入字段,分别是姓名、地址和年份。我将所有 3 个变量的长度作为 props 传递给这个错误组件。 errorText 应该默认隐藏,如果名称少于 4 个字母则变为可见。

问题是当我输入一个少于 4 个字母的名称时,它将 errorText 变量更改为正确的“字段错误:名称”,我可以通过警报看到,但 P 元素仍然没有更改并保持为空。

默认情况下 errorText 不是我需要的另一个原因是,我有更多的 If 语句用于每个替代实例。比如Address和Name都小于4,那么就需要说“Error in field: address, name”。

这可能是什么问题?提前致谢。

const Error = (props) => {
    let errorText = '';
    let isVisible = false;
   
    if (props.nameLength < 4 && props.addressLength >= 4 && props.yearLength >= 4) {
        errorText = "Error in field: name"
        isVisible = true;
        alert("errorText: " + errorText); //This alert is only for testing
    }
    
    return (
    <div>
        <p style={{visibility: isVisible ? "visible" : "hidden"}}>{errorText}</p>
    </div>
    )
}

错误由 return 中的以下按钮呈现:

<button type="submit" onClick={() => Error({nameLength, addressLength, yearLength})}>Add</button>

在 React 中,为了影响您的 DOM 我们需要使用状态管理。因此,每次您使用变量更改 components/elements 时,都应在状态中提供。

尝试替换:

let isVisible = false

const [isVisible, setIsVisible] = React.useState(false);

并尝试改变

isVisible = true

里面如果有

setIsVisible(true)

我会以这种方式重构组件,然后它应该可以如你所愿地工作

const Error = (props) => {
    const [error, setError] = useState({errorText: '', isVisible: false})

    useEffect(() => {
      if (props.nameLength < 4 && props.addressLength >= 4 && props.yearLength >= 4) {
        setError({errorText: "Error in field: name", isVisible: true})
      }
    },[])
   
    
    return (
    <div>
        {error?.isVisible && <p>{error?.errorText}</p>}
    </div>
    )
}

工作示例https://codesandbox.io/s/bold-chihiro-bnlw5?file=/src/App.js

在 React 中,您应该将组件视为函数 (state and props) -> elements 牢记这一点,这是您的用例的简单实现。

请注意,Error 始终会被渲染,并且它会对传递给它的 props 值做出反应

import { useState } from "react";
import "./styles.css";

const Error = ({ nameLength, addressLength, yearLength }) => {
  let errorText = "";

  if (nameLength < 4 && addressLength >= 4 && yearLength >= 4) {
    errorText = "error in field name";
  }

  return errorText ? <div>{errorText}</div> : null;
};

export default function App() {
  const [nameValue, setNameValue] = useState("");
  const [addressValue, setAddressValue] = useState("");
  const [yearValue, setYearValue] = useState("");
  return (
    <div className="App">
      <div>
        <input
          name="name"
          placeholder="name"
          value={nameValue}
          onChange={(e) => setNameValue(e.currentTarget.value)}
        />
        <input
          name="address"
          placeholder="address"
          value={addressValue}
          onChange={(e) => setAddressValue(e.currentTarget.value)}
        />
        <input
          name="year"
          placeholder="year"
          value={yearValue}
          onChange={(e) => setYearValue(e.currentTarget.value)}
        />
      </div>
      <Error
        nameLength={nameValue.length}
        addressLength={addressValue.length}
        yearLength={yearValue.length}
      />
    </div>
  );
}