程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了未使用 React Router 的重定向到安装组件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决未使用 React Router 的重定向到安装组件?

开发过程中遇到未使用 React Router 的重定向到安装组件的问题如何解决?下面主要结合日常开发的经验,给出你关于未使用 React Router 的重定向到安装组件的解决方法建议,希望对你解决未使用 React Router 的重定向到安装组件有所启发或帮助;

即使我能够走这条路线,与 /login 路线关联的登录组件也没有安装。我在下面添加了总共 5 个组件(App、Login、Auth、Layout3、topbar)的代码。对于 Auth 组件,我正在使用 'react-token'auth' 包。如果您有任何问题,请告诉我,代码可能看起来很多。但是您可以专注于 topbar 组件的代码,因为这是我重定向到登录路由的地方。当然,在 App 组件中,我已经添加了 Login 的路由。因此 topbar 和 App 组件可能存在问题。

这是我为我的应用程序定义所有路由的 App 组件。

  class App extends Component {
  render() {
  <StylesProvIDer injectFirst>
    <div>
      <browserRouter>
        <Switch>
          <Route exact path='/login' component={Login} />
          <Route exact path='/' component={Layout3} />
        </Switch>
      </browserRouter>
    </div>
  </StylesProvIDer>
  }

现在,这是登录组件。在这里,如果用户登录,他将被重定向到 '/' 路由,即 Layout3 组件。但如果此人未登录,则会显示登录页面。我已经在返回中添加了逻辑。 UseAuth() 指向我从 react-token-auth 包中导入 createauthprovIDer 的 Auth.Js 文件。

export default function Login(props) {
const [username,setUsername] = useState('')
const [password,setpassword] = useState('')
const [loggedIn,setLoggedIn] = useState(false)

const onsubmitClick = (E) => {
    e.preventDefault()
    console.log("You pressed login")
    let opts = {
        'username': username,'password': password
    }
    console.log(opts)
    fetch('/API/login',{
        method: 'post',body: JsON.Stringify(opts)
    }).then(r => r.Json())
        .then(token => {
            if (token.access_token) {
                login(token)
                // setLoggedIn(true)

                console.log(token)
            }
            else {
                console.log("Please type in correct username/password")
            }
        })
}

const handleUsernameChange = (E) => {
    setUsername(e.target.value)
}

const handlepasswordChange = (E) => {
    setpassword(e.target.value)
}

const [logged] = useAuth();

console.log('logged or not: ',logged);

return (
    <div style={{
        BACkgroundcolor: 'white',height: '100%',display: 'flex',flexDirection: 'column',alignItems: 'center'
    }}>

        {!logged ?
            <>
                <h1>Please Log In</h1>
                <form>
                    <label>
                        <p>Username</p>
                        <input type="text"
                            onChange={handleUsernameChangE}
                        />
                    </label>
                    <label>
                        <p>password</p>
                        <input type="password"
                            onChange={handlepasswordChangE}
                        />
                    </label>
                    <div>
                        <button
                            type="submit"
                            onClick={onsubmitClick}
                        >submit</button>
                    </div>
                </form>
            </>
            :
            <>
                <Redirect to='/' push={truE} />
            </>
        }
    </div>
)
}

这是我说的 Auth.Js 文件。

  import { createauthprovIDer } from 'react-token-auth';


export const [useAuth,authFetch,login,logout] =
createauthprovIDer({
    accesstokenKey: 'access_token',onupdatetoken: (token) => fetch('/API/refresh',{
        method: 'POST',body: token.access_token
    })
        .then(r => r.Json())
});

这是 Layout3 组件,我将在其中有条件地转到 Layout3 组件或登录组件。

   class Layout3 extends Component {

state = {
    authmessage: '',loginStatus: false
}

componentDIDMount() {
    authFetch("/API/protected").then(response => {
        console.log('response insIDe authenticationFetch: ',responsE)
        if (response.status === 401) {
            this.setState({ authmessage: response.status })
            return null
        }
        return response.Json()
    }).then(response => {
        if (response && response.messagE) {
            this.setState({ authmessage: response.message })
        }
    })
}

  render() {

    return (
        <>
            {
                this.state.authmessage === 401 ?
                    <>
                        <browserRouter>
                            <Redirect to='/login' />
                        </browserRouter>
                    </>
                    :
                    <>
                        <browserRouter>
                            <Switch>
                                <Route exact path='/'>
                                <topbar/>
                            </Switch>
                        </browserRouter>
                    </>
                  }
               </>...

最后,这是退出按钮所在的 topbar。

 class topbar extends Component {
     state = {
        loggedOut: false
      }

 dashboardlogout = () => {
    this.setState({ loggedOut: true });
 }

  render() {

    console.log('state insIDe topbar ',this.state.loggedOut)
    if (this.state.loggedOut === truE) {
        logout()
        return (
            <Redirect from="/" to="/login" push={truE} />
        )
    }
    return(
       <ul class="nav navbar-top-links navbar-right">
                    <li>
                        <button onClick={this.dashboardlogout}>
                            <i class="fa fa-sign-out"></i> Log out
                        </button>
                    </li>
                </ul>
      );
   }
   }
 

解决方法

您不能像这样导出export const [useAuth,authFetch,login,logout]

必须是已定义的变量

import { createauthprovider } from "react-token-auth";

export const useauthprovider = createauthprovider({
  accessTokenKey: "access_token",onupdateToken: (token) =>
    fetch("/api/refresh",{
      method: "POST",body: token.access_token
    }).then((r) => r.json())
});

稍后您可以在 Login.js

中通过解构调用使用它
const [useAuth,logout] = useauthprovider();
const [logged] = useAuth();

还有 Layout3 看起来不太好,因为它违反了单一职责原则。基于条件的重定向必须在路由器级别实现

大佬总结

以上是大佬教程为你收集整理的未使用 React Router 的重定向到安装组件全部内容,希望文章能够帮你解决未使用 React Router 的重定向到安装组件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:未使用