Выполнять проверку перед каждым рендерингом - PullRequest
3 голосов
/ 26 марта 2020

Я работаю над этим компонентом и хочу проверять его поля перед каждым рендерингом. Если они недействительны, я хочу отключить кнопку в родительском элементе.

Вот что я получил до сих пор:

export default function Input(props) {

  const [inputs] = useState(props.inputs);

  const didChangeRef = useRef([]);

  useEffect(() => {
    if (!_.isEqual(didMountRef.current, props.inputs)) {
      validateInput(input);
      didChangeRef.current = props.inputs;
    }
  });

  const validateInput = input => {
     const errors = useValidation(input);
     if(Object.keys(errors).length !== 0) {
       props.setIsValid(false);
     }
  }

 return (
  <input
   onChange={e=> props.setProperty(e)}>
  </input>
  <input
   onChange={e=> props.setProperty(e)}>
  </input>
 )
}

Если вход изменяется, он устанавливает свойство в родительском и этот компонент перерисовывается. Входные данные - это массив объектов, и я буду sh проверять его содержимое на каждом рендере (или componentDidMount). Я либо получаю l oop бесконечно, либо запускаю проверку только один раз.

Я ценю вашу помощь.

PS:

Я также попробовал другой подход, но он все еще завершается бесконечно:

export default function Input(props) {

  const didMountRef = useRef(true);

  useLayoutEffect(() => {
    if (didMountRef.current) {
      didMountRef.current = false;
      return;
    }
    validate(input);
  });

  const validate = input => {
    // validation...
  }

}

Вот родительский компонент:

class CreateShoppingItem extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      storage: {},
      isValid: true,
    };
  }

  setIsValid = (isValid) => {
    this.setState({ isValid });
  };

  render() {
    return (
      <div>
        <Input setIsValid={this.setIsValid} inputs={this.storage.inputs} />
        <Button disable={!isValid}></Button>
      </div>
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...