我的上下文抛出错误 'Object(...)(...)' 因为它是空的
My Context Throw Error 'Object(...)(...)' as it is null
大家好 大家好,我在登录注册系统上工作,我使用上下文进行状态管理。我在这个系统上使用 cookie,我希望这个 cookie 在 cookieContext 中运行,我可以 运行 在合并到 main 之前,但我现在不能 运行。我不明白一切看起来都很好请帮助我我会失去我的
我的上下文代码:
import { createContext } from 'react';
import cookie from 'js-cookie';
const CookieContext = createContext(null);
export const CookieProvider = ({ children }) => {
const setUserCookie = (name, token) => {
cookie.set(name, `Bearer ${token}`);
};
const isCookie = (name) => {
const mycookie = cookie.get(name);
if (!mycookie) return 0;
return 1;
};
const values = {
setUserCookie,
isCookie,
};
return <CookieContext.Provider value={values}>{children}</CookieContext.Provider>;
};
export default CookieContext;
我在 index.js 上实现,所以我的索引代码:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'font-awesome/css/font-awesome.min.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';
import { CookieProvider } from './Contexts/CookieContext/cookieContext';
ReactDOM.render(
<BrowserRouter>
<React.StrictMode>
<CookieProvider>
<App />
</CookieProvider>
</React.StrictMode>
<App />
</BrowserRouter>,
document.getElementById('root'),
);
我的主要组件应用程序:
import './App.css';
import 'owl.carousel/dist/assets/owl.carousel.css';
import 'owl.carousel/dist/assets/owl.theme.default.css';
import HomePage from './Views/HomePage';
import Header from './Components/Header';
import Footer from './Components/Footer';
import BlogDetail from './Views/BlogDetailPage';
import Login from './Views/Login';
import Register from './Views/Register';
import { Switch, Route } from 'react-router-dom';
function App() {
return (
<>
<Header />
<Switch>
<Route path="/" exact component={HomePage} />
<Route path="/article/:id" exact component={BlogDetail} />
<Route path="/login" component={Login} />
<Route path="/register" component={Register} />
</Switch>
<Footer />
</>
);
}
export default App;
正如我在开始时所说,我正在处理登录、注册页面登录和注册页面,例如 View 组件,它们包含表单组件,因此此错误来自表单 components.Register 或登录页面无法打开。
我的注册表单组件:
import { useState, useContext } from 'react';
import './styles.css';
import axios from 'axios';
import CookieContext from '../../../Contexts/CookieContext/cookieContext';
import { Redirect } from 'react-router-dom';
function RegisterForm() {
const { setUserCookie, isCookie } = useContext(CookieContext);
const [errorMessage, setErrorMessage] = useState('');
const [userDataRegister, setUserDataRegister] = useState({
name: '',
surname: '',
username: '',
password: '',
confirmPassword: '',
phoneNumber: '',
email: '',
gender: '',
});
const [file, setFile] = useState();
const result = isCookie('user');
if (result === 1) {
return <Redirect to="/" />;
}
// const url = `${process.env.REACT_APP_CLIENT_URL}/`
const handleSubmit = async (e) => {
setErrorMessage('');
e.preventDefault();
if (
userDataRegister.name === '' ||
userDataRegister.surname === '' ||
userDataRegister.password === '' ||
userDataRegister.confirmPassword === '' ||
userDataRegister.phoneNumber === '' ||
userDataRegister.email === '' ||
userDataRegister.gender === ''
) {
setErrorMessage('* ile işaretli alanlar boş bırakılamaz');
}
const { name, surname, username, password, phoneNumber, email, gender } = userDataRegister;
const data = new FormData();
data.append('name', name);
data.append('surname', surname);
data.append('username', username);
data.append('password', password);
data.append('phoneNumber', phoneNumber);
data.append('email', email);
data.append('gender', gender);
data.append('profilPicture', file);
const config = {
headers: { 'content-type': 'multipart/form-data' },
};
const response = await axios.post('posturl', data, config);
if (response.data.code === 11000)
setErrorMessage('Bu kullanıcı zaten mevcut,üyeyseniz lütfen giriş yapınız.');
console.log(response);
if (response.data.token) {
setUserCookie('user', response.data.token);
window.location.href = '/';
}
};
const handleChange = (e) => {
setUserDataRegister({ ...userDataRegister, ...{ [e.target.name]: e.target.value } });
};
const handleFile = (e) => {
setUserDataRegister({ ...userDataRegister, ...{ [e.target.name]: e.target.files[0] } });
setFile(e.target.files[0]);
};
return (
<form className="w-100 p-4 border shadow" onSubmit={handleSubmit}>
<div className="form-group">
<label htmlFor="name">
Adınız <span className="text-danger">*</span>
</label>
<input name="name" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="surname">
Soyadınız <span className="text-danger">*</span>
</label>
<input name="surname" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="username">
Kullanıcı adınız <span className="text-danger">*</span>
</label>
<input name="username" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="password" className="form-control-label">
Şifreniz <span className="text-danger">*</span>
</label>
<input name="password" type="password" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="confirmPassword" className="form-control-label">
Tekrar Şifreniz <span className="text-danger">*</span>
</label>
<input
name="confirmPassword"
type="password"
className="form-control"
onChange={handleChange}
/>
</div>
<div className="form-group">
<label htmlFor="phoneNumber" className="form-control-label">
Telefon Numaranız<span className="text-danger">*</span>
</label>
<input name="phoneNumber" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="email" className="form-control-label">
E-posta Adresiniz<span className="text-danger">*</span>
</label>
<input name="email" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="gender" className="form-control-label">
Cinsiyet <span className="text-danger">*</span>{' '}
</label>
<select className="form-control" name="gender" onChange={handleChange}>
<option defaultValue="selected">Cinsiyet Seçiniz</option>
<option defaultValue="Woman">Kadın</option>
<option defaultValue="Man">Erkek</option>
</select>
</div>
<div className="form-group">
<label htmlFor="profilPicture" className="form-control-label">
Profil Fotoğrafı
</label>
<input
type="file"
name="profilPicture"
className="form-control-file"
id="profilPicture"
onChange={handleFile}
/>
</div>
<button type="submit" className="btn btn-block btnBg text-white my-2">
Kayıt Ol
</button>
{errorMessage !== '' && <small className="text-danger lead">{errorMessage}</small>}
<p className="text-danger lead" style={{ fontSize: '12px' }}>
Error
</p>
</form>
);
}
export default RegisterForm;
除了我认为您只需要提供更好的初始上下文值而不是 null
.
之外,我没有看到您的代码有太多明显的错误
const CookieContext = createContext({
isCookie: false,
setUserCookie: () => {},
});
Updating Context from a Nested Component
It is often necessary to update the context from a component that is
nested somewhere deeply in the component tree. In this case you can
pass a function down through the context to allow consumers to update
the context:
theme-context.js
// Make sure the shape of the default value passed to
// createContext matches the shape that the consumers expect!
export const ThemeContext = React.createContext({
theme: themes.dark,
toggleTheme: () => {},
});
大家好 大家好,我在登录注册系统上工作,我使用上下文进行状态管理。我在这个系统上使用 cookie,我希望这个 cookie 在 cookieContext 中运行,我可以 运行 在合并到 main 之前,但我现在不能 运行。我不明白一切看起来都很好请帮助我我会失去我的
我的上下文代码:
import { createContext } from 'react';
import cookie from 'js-cookie';
const CookieContext = createContext(null);
export const CookieProvider = ({ children }) => {
const setUserCookie = (name, token) => {
cookie.set(name, `Bearer ${token}`);
};
const isCookie = (name) => {
const mycookie = cookie.get(name);
if (!mycookie) return 0;
return 1;
};
const values = {
setUserCookie,
isCookie,
};
return <CookieContext.Provider value={values}>{children}</CookieContext.Provider>;
};
export default CookieContext;
我在 index.js 上实现,所以我的索引代码:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'font-awesome/css/font-awesome.min.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';
import { CookieProvider } from './Contexts/CookieContext/cookieContext';
ReactDOM.render(
<BrowserRouter>
<React.StrictMode>
<CookieProvider>
<App />
</CookieProvider>
</React.StrictMode>
<App />
</BrowserRouter>,
document.getElementById('root'),
);
我的主要组件应用程序:
import './App.css';
import 'owl.carousel/dist/assets/owl.carousel.css';
import 'owl.carousel/dist/assets/owl.theme.default.css';
import HomePage from './Views/HomePage';
import Header from './Components/Header';
import Footer from './Components/Footer';
import BlogDetail from './Views/BlogDetailPage';
import Login from './Views/Login';
import Register from './Views/Register';
import { Switch, Route } from 'react-router-dom';
function App() {
return (
<>
<Header />
<Switch>
<Route path="/" exact component={HomePage} />
<Route path="/article/:id" exact component={BlogDetail} />
<Route path="/login" component={Login} />
<Route path="/register" component={Register} />
</Switch>
<Footer />
</>
);
}
export default App;
正如我在开始时所说,我正在处理登录、注册页面登录和注册页面,例如 View 组件,它们包含表单组件,因此此错误来自表单 components.Register 或登录页面无法打开。
我的注册表单组件:
import { useState, useContext } from 'react';
import './styles.css';
import axios from 'axios';
import CookieContext from '../../../Contexts/CookieContext/cookieContext';
import { Redirect } from 'react-router-dom';
function RegisterForm() {
const { setUserCookie, isCookie } = useContext(CookieContext);
const [errorMessage, setErrorMessage] = useState('');
const [userDataRegister, setUserDataRegister] = useState({
name: '',
surname: '',
username: '',
password: '',
confirmPassword: '',
phoneNumber: '',
email: '',
gender: '',
});
const [file, setFile] = useState();
const result = isCookie('user');
if (result === 1) {
return <Redirect to="/" />;
}
// const url = `${process.env.REACT_APP_CLIENT_URL}/`
const handleSubmit = async (e) => {
setErrorMessage('');
e.preventDefault();
if (
userDataRegister.name === '' ||
userDataRegister.surname === '' ||
userDataRegister.password === '' ||
userDataRegister.confirmPassword === '' ||
userDataRegister.phoneNumber === '' ||
userDataRegister.email === '' ||
userDataRegister.gender === ''
) {
setErrorMessage('* ile işaretli alanlar boş bırakılamaz');
}
const { name, surname, username, password, phoneNumber, email, gender } = userDataRegister;
const data = new FormData();
data.append('name', name);
data.append('surname', surname);
data.append('username', username);
data.append('password', password);
data.append('phoneNumber', phoneNumber);
data.append('email', email);
data.append('gender', gender);
data.append('profilPicture', file);
const config = {
headers: { 'content-type': 'multipart/form-data' },
};
const response = await axios.post('posturl', data, config);
if (response.data.code === 11000)
setErrorMessage('Bu kullanıcı zaten mevcut,üyeyseniz lütfen giriş yapınız.');
console.log(response);
if (response.data.token) {
setUserCookie('user', response.data.token);
window.location.href = '/';
}
};
const handleChange = (e) => {
setUserDataRegister({ ...userDataRegister, ...{ [e.target.name]: e.target.value } });
};
const handleFile = (e) => {
setUserDataRegister({ ...userDataRegister, ...{ [e.target.name]: e.target.files[0] } });
setFile(e.target.files[0]);
};
return (
<form className="w-100 p-4 border shadow" onSubmit={handleSubmit}>
<div className="form-group">
<label htmlFor="name">
Adınız <span className="text-danger">*</span>
</label>
<input name="name" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="surname">
Soyadınız <span className="text-danger">*</span>
</label>
<input name="surname" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="username">
Kullanıcı adınız <span className="text-danger">*</span>
</label>
<input name="username" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="password" className="form-control-label">
Şifreniz <span className="text-danger">*</span>
</label>
<input name="password" type="password" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="confirmPassword" className="form-control-label">
Tekrar Şifreniz <span className="text-danger">*</span>
</label>
<input
name="confirmPassword"
type="password"
className="form-control"
onChange={handleChange}
/>
</div>
<div className="form-group">
<label htmlFor="phoneNumber" className="form-control-label">
Telefon Numaranız<span className="text-danger">*</span>
</label>
<input name="phoneNumber" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="email" className="form-control-label">
E-posta Adresiniz<span className="text-danger">*</span>
</label>
<input name="email" className="form-control" onChange={handleChange} />
</div>
<div className="form-group">
<label htmlFor="gender" className="form-control-label">
Cinsiyet <span className="text-danger">*</span>{' '}
</label>
<select className="form-control" name="gender" onChange={handleChange}>
<option defaultValue="selected">Cinsiyet Seçiniz</option>
<option defaultValue="Woman">Kadın</option>
<option defaultValue="Man">Erkek</option>
</select>
</div>
<div className="form-group">
<label htmlFor="profilPicture" className="form-control-label">
Profil Fotoğrafı
</label>
<input
type="file"
name="profilPicture"
className="form-control-file"
id="profilPicture"
onChange={handleFile}
/>
</div>
<button type="submit" className="btn btn-block btnBg text-white my-2">
Kayıt Ol
</button>
{errorMessage !== '' && <small className="text-danger lead">{errorMessage}</small>}
<p className="text-danger lead" style={{ fontSize: '12px' }}>
Error
</p>
</form>
);
}
export default RegisterForm;
除了我认为您只需要提供更好的初始上下文值而不是 null
.
const CookieContext = createContext({
isCookie: false,
setUserCookie: () => {},
});
Updating Context from a Nested Component
It is often necessary to update the context from a component that is nested somewhere deeply in the component tree. In this case you can pass a function down through the context to allow consumers to update the context:
theme-context.js
// Make sure the shape of the default value passed to // createContext matches the shape that the consumers expect! export const ThemeContext = React.createContext({ theme: themes.dark, toggleTheme: () => {}, });