代码之家  ›  专栏  ›  技术社区  ›  Hasan Zubairi

React useContext Reender组件

  •  0
  • Hasan Zubairi  · 技术社区  · 5 年前

    我正在尝试在我的应用程序中使用useContext钩子而不是Redux。标题组件和登录页面都使用相同的上下文。两者都是使用上下文提供程序的路由组件的子组件。在注册表格中,我使用硬编码数据检查功能。注册后标题不会重新命名。

    应用程序。js(登录组件)

    import React, { useContext, useState } from "react";
    import { ExamContext } from "./Context/ExamContext";
    
    function App() {
      const [user, setUser] = useState("");
      const [pass, setPass] = useState("");
    
      const { role, login } = useContext(ExamContext);
    
      const handleSubmit = () => {
        login(user, "Admin");
      };
    
      return (
        <React.Fragment>
          <div className="appbg">
            <div className="container">
              <div className="panel panel-success" style={{ marginTop: 20 }}>
                <div className="panel-heading">Login Forms</div>
                <div className="panel-body">
                  <div className="form-group">
                    <label>Email</label>
                    <input
                      type="text"
                      className="form-control"
                      value={user}
                      onChange={e => setUser(e.target.value)}
                    />
                  </div>
                </div>
                <div className="panel-body">
                  <div className="form-group">
                    <label>Password</label>
                    <input
                      type="password"
                      className="form-control"
                      value={pass}
                      onChange={e => setPass(e.target.value)}
                    />
                  </div>
                </div>
                <button className="btn btn-success" onClick={handleSubmit}>
                  Submit
                </button>
              </div>
            </div>
          </div>
        </React.Fragment>
      );
    }
    
    export default App;
    

    标题组件

    const Header = () => {
      const { role } = useContext(ExamContext);
    
      const [user] = useState(role);
    
      switch (user) {
        case "Admin":
          return (
            <div>
              <h4>Admin</h4>
            </div>
          );
        case "User":
          return (
            <div>
              <h4>User</h4>
            </div>
          );
        default:
          return (
            <div>
              <h4>No User</h4>
            </div>
          );
      }
    };
    export default Header;
    

    背景呢

    import React, { createContext, useState } from "react";
    
    const ExamContext = createContext();
    
    const ExamConProvider = ({ children }) => {
      const [user, setUser] = useState("");
      const [role, setRole] = useState("NoUser");
    
      const login = (getuser, getrole) => {
        setRole(getrole);
        setUser(getuser);
      };
    
      return (
        <ExamContext.Provider value={{ user, role, login }}>
          {children}
        </ExamContext.Provider>
      );
    };
    
    export { ExamContext, ExamConProvider }; 
    

    指数js

    import React from 'react';
    import ReactDOM from 'react-dom';
    import Routing from './components/Routing';
    import { ExamConProvider } from './Context/ExamContext'
    import './scss/style.scss';
    
    
    ReactDOM.render(
        <ExamConProvider>
            <Routing />
        </ExamConProvider>
        ,document.getElementById("root"))
    

    路由模块

    import React from 'react';
    import { BrowserRouter, Route } from 'react-router-dom';
    import App from '../App';
    import Home from '../containers/Home';
    import Header from '../components/Header';
    import Footer from '../components/Footer';
    
    const Routing = () => {
        return(
            <BrowserRouter>
            <Header />
                <Route exact path="/" component={App}></Route>
                <Route path="/home" component={Home}></Route>
            <Footer />
            </BrowserRouter>
        )
    }
    
    export default Routing;
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   Wing Choy    5 年前

    不确定是否询问为什么标题没有重新呈现。如果是,原因是您没有添加 Context Provider 进入 <App /> .

    你应该像下面那样添加它:

    import React, { useContext, useState } from 'react';
    import { ExamConProvider, ExamContext } from './Context/ExamContext';
    // Remember to import ExamConProvider at above line
    
    function App() {
    
        // ... blah blah blah
    
        return(
            <ExamConProvider> {/* <--- Add this */}
                <React.Fragment>
                    {/* Blah blah blah */}
                </React.Fragment>
            </ExamConProvider> {/* <--- Add this */}
        );
    }
    
    export default App;
    

    干杯