reactjs - Reactjs TypeError:render is not a function in contrxt-api with react-router-dom
问题描述
嗨,我正在我正在使用的这个项目中创建一个项目react router
,并且context api
。当我尝试使用context
时。我正面临这个问题。这是我的App.js code
。我正在使用 "react-router-dom": "^5.2.0",
。我有两个组件Login
,Messenger
在里面router
//app.js
import logo from "./logo.svg";
import "./App.css";
import Login from "./pages/auth/signIn/Login";
import Messenger from "./pages/messenger/index";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import { ToastContainer } from "react-toastify";
import ChatContextProvider from "../src/helpers/chatContext/Index";
import CustomizerContextProvider from "../src/helpers/customizerContext/Index";
function App() {
return (
<Router>
<Switch>
<CustomizerContextProvider>
<ChatContextProvider>
<Route exact path="/" component={Login} />
</ChatContextProvider>
</CustomizerContextProvider>
<CustomizerContextProvider>
<ChatContextProvider>
<Route exact path="/homer" component={Messenger} />
</ChatContextProvider>
</CustomizerContextProvider>
</Switch>
</Router>
);
}
export default App;
//这是index.js文件
import React from "react";
import ReactDOM from "react-dom";
import "./assets/scss/color.scss";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));
//这里是我的登录组件。并且 Messenger 组件与 Login //组件相同
import React, { useState } from "react";
import { useHistory } from "react-router-dom";
//import firebase from "../../../config/firebase";
import { toast } from "react-toastify";
const Login = (props) => {
const [credential, setCredential] = useState({
email: "test@gmail.com",
password: "test@123",
});
const router = useHistory();
const handleChange = (e) => {
const { name, value } = e.target;
setCredential({ ...credential, [name]: value });
};
// simple firebase login
const firebaseLogin = async (email, password) => {
alert("login");
};
const redirectToSignUpPage = () => {
router.push("/auth/signUp");
};
return (
<div className="login-page1">
<div className="container-fluid p-0">
<div className="row m-0">
<div className="col-12 p-0">
<div className="login-contain-main">
<div className="left-page">
<div className="login-content">
<div className="login-content-header">
<a href="/landing">
<img
className="image-fluid"
src="/assets/images/logo/landing-logo.png"
alt="images"
/>
</a>
</div>
<h3>Hello Everyone , We are Chitchat</h3>
<h4>Welcome to chitchat please login to your account.</h4>
<form className="form1">
<div className="form-group">
<label className="col-form-label" htmlFor="inputEmail3">
Email Address
</label>
<input
className="form-control"
id="inputEmail3"
defaultValue={credential.email}
onChange={(e) => handleChange(e)}
name="email"
type="email"
placeholder="Demo@123gmail.com"
/>
</div>
<div className="form-group">
<label
className="col-form-label"
htmlFor="inputPassword3"
>
Password
</label>
<span> </span>
<input
className="form-control"
id="inputPassword3"
defaultValue={credential.password}
onChange={(e) => handleChange(e)}
name="password"
type="password"
placeholder="*******"
/>
</div>
<div className="form-group">
<div className="rememberchk">
<div className="input-text form-check pl-0">
<input
type="checkbox"
id="gridCheck1"
aria-label="Checkbox for following text input"
/>
<label
className="form-check-label ml-2 mr-auto"
htmlFor="gridCheck1"
>
Remember Me.
</label>
<h6>Forgot Password?</h6>
</div>
</div>
</div>
<div className="form-group">
<div className="buttons">
<a
className="btn btn-primary button-effect"
href="#"
onClick={() =>
firebaseLogin(credential.email, credential.password)
}
>
Login
</a>
<a
className="btn button-effect btn-signup"
href="#"
onClick={() => redirectToSignUpPage()}
>
SignUp
</a>
</div>
</div>
</form>
<div className="line">
<h6>OR Connect with</h6>
</div>
<div className="medialogo">
<ul>
<li>
<a
className="icon-btn btn-danger button-effect"
href="#"
>
<i className="fa fa-google"></i>
</a>
</li>
<li>
<a
className="icon-btn btn-primary button-effect"
href="#"
>
<i className="fa fa-twitter"></i>
</a>
</li>
<li>
<a
className="icon-btn btn-facebook button-effect"
href="#"
>
<i className="fa fa-facebook-f"></i>
</a>
</li>
</ul>
</div>
<div className="termscondition">
<h4 className="mb-0">
<span>*</span>Terms and condition<b>&</b>Privacy
policy
</h4>
</div>
</div>
</div>
<div className="right-page">
<div className="right-login animat-rate">
<div className="animation-block">
<div className="bg_circle">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
<div className="cross"></div>
<div className="cross1"></div>
<div className="cross2"></div>
<div className="dot"></div>
<div className="dot1"></div>
<div className="maincircle"></div>
<div className="top-circle"></div>
<div className="center-circle"></div>
<div className="bottom-circle"></div>
<div className="bottom-circle1"></div>
<div className="right-circle"></div>
<div className="right-circle1"></div>
<img
className="heart-logo"
src="/assets/images/login_signup/5.png"
alt="login logo"
/>
<img
className="has-logo"
src="/assets/images/login_signup/4.png"
alt="login logo"
/>
<img
className="login-img"
src="/assets/images/login_signup/1.png"
alt="login logo"
/>
<img
className="boy-logo"
src="/assets/images/login_signup/6.png"
alt="login boy logo"
/>
<img
className="girl-logo"
src="/assets/images/login_signup/7.png"
alt="girllogo"
/>
<img
className="cloud-logo"
src="/assets/images/login_signup/2.png"
alt="login logo"
/>
<img
className="cloud-logo1"
src="/assets/images/login_signup/2.png"
alt="login logo"
/>
<img
className="cloud-logo2"
src="/assets/images/login_signup/2.png"
alt="login logo"
/>
<img
className="cloud-logo3"
src="/assets/images/login_signup/2.png"
alt="login logo"
/>
<img
className="cloud-logo4"
src="/assets/images/login_signup/2.png"
alt="login logo"
/>
<img
className="has-logo1"
src="/assets/images/login_signup/4.png"
alt="login logo"
/>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
);
};
export default Login;
解决方案
我相信您的上下文提供者应该<Switch>
像这样超出您的范围:
import logo from "./logo.svg";
import "./App.css";
import Login from "./pages/auth/signIn/Login";
import Messenger from "./pages/messenger/index";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import { ToastContainer } from "react-toastify";
import ChatContextProvider from "../src/helpers/chatContext/Index";
import CustomizerContextProvider from "../src/helpers/customizerContext/Index";
function App() {
return (
<Router>
<CustomizerContextProvider>
<ChatContextProvider>
<Switch>
<Route exact path="/" component={Login} />
<Route exact path="/homer" component={Messenger} />
</Switch>
</ChatContextProvider>
</CustomizerContextProvider>
</Router>
);
}
export default App;
或者即使您将上下文提供程序保留在您的内部<Switch>
,它也应该是这样的:
<Router>
<Switch>
<CustomizerContextProvider>
<ChatContextProvider>
<Route exact path="/" component={Login} />
<Route exact path="/homer" component={Messenger} />
</ChatContextProvider>
</CustomizerContextProvider>
</Switch>
</Router>
看看我做的这个小演示
推荐阅读
- python - creating new column values according to filters
- java - Tomcat java应用程序上的线程饥饿 - WAITING for c3p0 BasicResourcePool.awaitAvailable 中的所有线程
- javascript - div作为页面滚动的水平滚动
- c - CS50 马里奥更多:想知道代码是否高效?
- javascript - 如何从数组中过滤出多个特定的键和值
- python - 将系列中的值映射到列上以替换 nan 值 pandas
- android-studio - 退格导致计算器崩溃
- java - 同时进行Wiremock记录和存根
- python - 如何在matplotlib中变换坐标轴
- windows - 批处理文件中的十六进制 FOR 循环