Ошибка: хуки могут быть вызваны только внутри тела компонента функции - PullRequest
0 голосов
/ 06 декабря 2018

Привет всем, я пытаюсь использовать хуки в моем приложении, но он постоянно говорит: необработанное отклонение (инвариантное нарушение): хуки можно вызывать только внутри тела функционального компонента.Я предполагаю, что одна из моих библиотек конфликтует с хуками, так как я не могу найти никаких проблем с кодом.

это мой package.json, я перенесу все с перекомпоновки на хуки ...Я попытался использовать ловушки с nex.js в тестовом проекте, и там он работал нормально ...

{
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start"
  },
  "dependencies": {
    "next": "^7.0.2",
    "next-images": "^1.0.1",
    "react": "^16.7.0-alpha.2",
    "react-dom": "^16.7.0-alpha.2",
    "recompose": "^0.30.0",
    "styled-components": "^4.1.1"
  },
  "devDependencies": {
    "babel-plugin-styled-components": "^1.9.0",
    "eslint": "^5.9.0",
    "eslint-plugin-react": "^7.11.1",
    "eslint-plugin-react-hooks": "^0.0.0"
  }
}

Это мой код:

import Layout from "../components/Layout";
import Head from "next/head";
import Register from "../blocks/Register";
import InputBox from "../components/InputBox";
import regexUtils from "../utils/regexUtils";
import { useState } from "react";


function BaseComponent() {
    const { errors, onSubmit } = useOnSubmit();
    const [name, setName] = useHandleInputChange("");
    const [email, setEmail] = useHandleInputChange("");
    const [password, setPassword] = useHandleInputChange("");
    const [passwordAgain, setPasswordAgain] = useHandleInputChange("");

    return (
        <Layout>
            <Head>
                <title>Sheet Builder - Register your account</title>
            </Head>
            <Register>
                <Register.Center>
                    <form>
                        <Register.Box>
                            <Register.Title>Create Account</Register.Title>
                            <InputBox error={errors.name} value={name} onChange={setName}>Your Name</InputBox>
                            <InputBox error={errors.email} value={email} onChange={setEmail}>Email</InputBox>
                            <InputBox error={errors.password} value={password} onChange={setPassword} mask>Password</InputBox>
                            <InputBox error={errors.passwordAgain} value={passwordAgain} onChange={setPasswordAgain} mask hint="Passwords must consist of at least 8 characters.">Password Again</InputBox>
                            <Register.Button onClick={onSubmit} type="submit" value="Register your Sheet Builder account" />
                        </Register.Box>
                    </form>
                </Register.Center>
            </Register>
        </Layout>
    );
}

function useHandleInputChange(initialState) {
    const [value, setValue] = useState(initialState);

    const handleInputChange = (e) => {
        setValue(e.target.value);
    };
    return [value, handleInputChange];
}

function useOnSubmit() {
    const initialState =
    {
        email: false,
        name: false,
        password: false,
        passwordAgain: false
    };

    const [errors, setErrors] = useState(initialState);

    const onSubmit = (e)=>{
        e.preventDefault();
        let result = {};
        result.email = !regexUtils.isEmailFormatValid(errors.email);
        result.name = !regexUtils.isFormatValid(errors.name);
        result.password = !regexUtils.isPasswordFormatValid(errors.password);
        result.passwordAgain = !regexUtils.isPasswordFormatValid(errors.passwordAgain);
        setErrors(result);
    };

    return {
        errors, 
        onSubmit
    };
}


export default BaseComponent;

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

вам нужно импортировать реагировать, чтобы функцию можно было рассматривать как функциональный компонент реагирования

import React, {useState} from 'react';

Прочтите этот блог, чтобы понять Зачем импортировать React из «реакции» в функциональном компоненте?

0 голосов
/ 06 декабря 2018

Похоже, что есть ошибка с отладчиком кода Visual Studio Microsoft.Я запустил программу из командной строки, и после этого она отлично работала.

...