next.js 请确保组件 Package 在提供程序中,即使在 Package 之后也是如此

dgsult0t  于 2023-04-20  发布在  其他
关注(0)|答案(2)|浏览(132)

我使用的是nextjs沿着react redux。
我得到这个错误:
错误:找不到react-redux上下文值;请确保组件 Package 在<Provider>中。
我已经尝试了一切,也 Package 在一个提供程序,但错误仍然存在。

import { useRouter } from 'next/router';
import { useState } from 'react'
import axios from 'axios'
import { useDispatch } from "react-redux";
import { authActions } from '../store';
import { Provider } from 'react-redux'
import store from '../store';

export default function Signup(props) {
    const router = useRouter();
    const dispatch = useDispatch();

    const [inputs, setInputs] = useState({
        name: "", email: "", password: ""
    });

    const handleChange = (e) => {
        setInputs((prevState) => ({
            ...prevState,
            [e.target.name]: e.target.value
        }))
    }

    const sendRequest = async (type = "signup") => {
        const res = await axios.post(`https://blog-app-23.onrender.com/api/user/${type}`, {
            name: inputs.name,
            email: inputs.email,
            password: inputs.password
        }).catch((err) => console.log(err));
        const data = await res.data;
        return data;
    }

    const handleSubmit = (e) => {
        e.preventDefault()
        console.log(inputs);
        sendRequest("signup")
            .then((data) => localStorage.setItem("userId", data.user._id))
            .then(() => dispatch(authActions.login()))
            .then(() => router.push("/courses"))
    }
    return (
        <Provider store={store}>
            <section>
                <div className='h-[100vh] flex items-center'>
                    <ReactNebula className="nebula" config={{ astres: smallSolarSystem }} />
                    <div className='w-1/2 h-[30rem]'><ComputersCanvas /></div>
                    <div className='w-1/2 h-[10rem] stu flex items-center'>
                        <div className='h-[30rem] w-[29rem] rounded-3xl bg-white stu flex mx-auto p-6 flex-col'>
                            <h1 className='text-2xl font-semibold'>Sign Up</h1>
                            <div className='mt-5 flex flex-col'>
                                <form onSubmit={handleSubmit}>
                                    <input name="name" onChange={handleChange} value={inputs.name} placeholder='name' className="py-2 my-3 px-5 ml-2 rounded-md bg-gray-200 text-gray-700 flex-grow mr-4" />
                                    <input name="email" onChange={handleChange} value={inputs.email} type={'email'} placeholder='email' className="py-2 my-3 px-5 ml-2 rounded-md bg-gray-200 text-gray-700 flex-grow mr-4" />
                                    <input name="password" onChange={handleChange} value={inputs.password} type={'password'} placeholder='password' className="py-2 my-3 px-5 ml-2 rounded-md bg-gray-200 text-gray-700 flex-grow mr-4" />
                                    <button type={"submit"} className=' mt-7 started text-white py-3 px-5 text-md rounded-2xl bg-red-500' >Sign Up</button>
                                </form>
                            </div>
                        </div>
                    </div>
                </div>
            </section>
        </Provider>
    )
}

我试了所有的方法,但代码不起作用。

cnwbcb6i

cnwbcb6i1#

您在<Provider>之外使用useDispatch(),因为<Provider>当前包含在<Signup>的标记中。
Signup的内容移动到一个单独的组件(下面命名为WithProvider)中***1***:

// imports...

export default function Signup(props) {
  return (
    <Provider store="store">
      <WithProvider {...props} />
    </Provider>
  )
}
function WithProvider(props) {
  // you can `useDispatch()` here because it's inside `<Provider>`
}

1-您可以将其命名为WithStore或其他任何您想要的名称;这是一个本地函数。默认导出仍然是<Signup>

4szc88ey

4szc88ey2#

Signup组件不能访问任何redux上下文,因为它是渲染redux上下文的组件。在ReactTree中将Provider提升到比任何需要访问它提供的上下文的组件更高的位置。在这种情况下,您可以简单地将Signup Package 在Provider组件中,它可以使用useDispatch钩子。
示例:

<Provider store={store}> // <-- provides redux context to sub-ReactTree
  ...
  <Signup />
  ...
</Provider>
export default function Signup(props) {
  const router = useRouter();
  const dispatch = useDispatch(); // <-- can access redux context now

  ...

  return (
    <section>
      ...
    </section>
  );
}

相关问题