Javascript React Redux如何在加载时自动启动操作
这是新的 我有一个React Redux应用程序,我在其中加载了一个JWT令牌,因此该应用程序在状态中通过授权设置=为“true”来指示这一点。这是可行的,它现在知道它的授权 在导航栏上,我有一个“注销”选项,我想单击该选项,并相应地从本地存储中删除JWT,并重新呈现导航栏以显示“登录” 首先,这里是带有授权等测试的导航栏:Javascript React Redux如何在加载时自动启动操作,javascript,reactjs,react-redux,Javascript,Reactjs,React Redux,这是新的 我有一个React Redux应用程序,我在其中加载了一个JWT令牌,因此该应用程序在状态中通过授权设置=为“true”来指示这一点。这是可行的,它现在知道它的授权 在导航栏上,我有一个“注销”选项,我想单击该选项,并相应地从本地存储中删除JWT,并重新呈现导航栏以显示“登录” 首先,这里是带有授权等测试的导航栏: import React, { Component } from 'react'; import { Link } from 'react-router'; import
import React, { Component } from 'react';
import { Link } from 'react-router';
import { connect } from 'react-redux';
import { Navbar, Nav, NavItem, NavDropdown, MenuItem } from "react-bootstrap"
import { LinkContainer } from 'react-router-bootstrap'
class NavMenu extends Component {
render() {
const { isAuthorised, username } = this.props;
return (
<div className='main-nav'>
<Navbar inverse collapseOnSelect>
<Navbar.Header>
<Navbar.Brand>
<Link to={'/'}>JobsLedger</Link>
</Navbar.Brand>
{<Navbar.Toggle />}
</Navbar.Header>
<Navbar.Collapse>
<Nav>
<LinkContainer to={'/'}>
<NavItem eventKey={1}><span className='glyphicon glyphicon-home'></span> Home</NavItem>
</LinkContainer>
<LinkContainer to={'/counter'}>
<NavItem eventKey={2} ><span className='glyphicon glyphicon-education'></span> Counter</NavItem>
</LinkContainer>
<LinkContainer to={'/fetchdata'}>
<NavItem eventKey={3}><span className='glyphicon glyphicon-th-list'></span> Fetch data</NavItem>
</LinkContainer>
{isAuthorised && (
<NavDropdown eventKey={4} title="Clients" id="basic-nav-dropdown">
<LinkContainer to={'/clients/index'}>
<MenuItem eventKey={4.1}><span className='glyphicon glyphicon-th-list'></span> Client List</MenuItem>
</LinkContainer>
<LinkContainer to={'/clients/create'}>
<MenuItem eventKey={4.2}><span className='glyphicon glyphicon-user'></span> New Client</MenuItem>
</LinkContainer>
<MenuItem eventKey={4.3}>Something else here</MenuItem>
<MenuItem divider />
<MenuItem eventKey={4.4}>Separated link</MenuItem>
</NavDropdown>
)}
</Nav>
{isAuthorised ? (
<Nav pullRight>
<NavItem eventKey={5}><span className='glyphicon glyphicon-user'></span> Hello {username}</NavItem>
<LinkContainer to={'/logOut'}>
<NavItem eventKey={6}> Log Out</NavItem>
</LinkContainer>
</Nav>
) : (
<Nav pullRight>
<LinkContainer to={'/login'}>
<NavItem eventKey={7} ><span className='glyphicon glyphicon-user'></span> Login</NavItem>
</LinkContainer>
</Nav>
)}
</Navbar.Collapse>
</Navbar>
</div>
);
}
}
const mapStateToProps = (state) => ({
isAuthorised: state.login.isAuthorised,
username: state.login.username,
})
export default connect(mapStateToProps)(NavMenu);
问题是没有“事件”,我可以挂断一个操作,因为它应该只是呈现“注销…”,并使用上面的函数从本地存储中删除JWT
目前,我已经将动作和减速器结合起来,但稍后将分开
所以我有三个文件。减速器的动作在顶部。Logout容器=>“logoutContainer”和Logout,这是一个非常简单的单行程序
这是我设置的代码
reducer文件(称为reducer.js)中的操作:
注销用户的reducer选项:
case LOGOUT_USER:
return {
...state,
isAuthorised: false,
}
这是我的logoutContainer:
import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'
import Logout from './logout'
import { logoutUser } from './reducer'
class LogoutContainer extends Component {
static contextTypes = {
router: PropTypes.object.isRequired
}
componentWillMount() {
console.log('Logout - componentDidMount')
logoutUser()
}
render() {
return (
<Logout />
)
}
}
const mapStateToProps = (state) => ({
isAuthorised: state.login.isAuthorised,
})
const mapDispatchToProps = (dispatch) => ({
logoutUser: () => dispatch(logoutUser()),
})
export default connect( mapDispatchToProps)(LogoutContainer)
import React,{Component,PropTypes}来自“React”
从“react redux”导入{connect}
从“./Logout”导入注销
从“./reducer”导入{logoutUser}
类LogoutContainer扩展组件{
静态上下文类型={
路由器:PropTypes.object.isRequired
}
组件willmount(){
console.log('Logout-componentDidMount')
logoutUser()
}
render(){
返回(
)
}
}
常量mapStateToProps=(状态)=>({
IsAuthorized:state.login.IsAuthorized,
})
const mapDispatchToProps=(调度)=>({
logoutUser:()=>调度(logoutUser()),
})
导出默认连接(mapDispatchToProps)(注销容器)
我想我可以调用componentWillMount()上的操作,该操作将调用“logoutUser()”,该操作将更新状态,同时呈现“Logged out..”并更新菜单栏
我发现了一个问题,表明我应该使用“componentDidMount()”,但它并没有改变任何东西,注销仍然并没有被调用
我认为这种方法不正确。。(好吧,它不起作用,所以这是一个线索)
如何单击导航栏上的“注销”链接,转到“LogoutContainer”,自动调用操作(logoutUser())并重新呈现页面,以及如何让导航栏重新检查“已授权”状态并意识到其未授权并重新呈现导航栏
这样做对吗
在我的案例中,“logoutUser()”甚至没有被调用..我需要将此作为一个答案发布,因为它很想得到一条评论,但首先将其视为一个建议和一些代码清理。你必须自己测试一下 首先是你的行动。这是一种“thunk action”处理程序编写操作的方式。您可以看到它是一个返回另一个函数的函数(因此thunk)。在您的代码中,您从未实际调用过它(这就是为什么没有调用任何东西,它会在thunk处停止。如果您想使用redux thunk中间件,请仔细阅读如何使用它,它与“正常”调度稍有不同 其次,你没有呼叫调度程序,因此你的操作不会被调用,redux也不会重新呈现你的应用程序
export const logoutUser = () =>
(dispatch, getState) => {
clearJwt()
dispatch({ type: LOGOUT_USER }) //Call the dispatcher with your action
}
在您的容器中,您需要正确使用@si2030在评论中提到的thunk和actions
import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'
import Logout from './logout'
import { logoutUser } from './reducer'
class LogoutContainer extends Component {
componentDidMount() {
this.props.logoutUser();
}
render() {
return (
<Logout />
)
}
}
const mapStateToProps = (state) => ({
isAuthorised: state.login.isAuthorised,
});
//Just return a map with your actions and call them with this.props.yourAction
const mapDispatchToProps = {
logoutUser
};
};
//Connect is a function that takes your state map and your actions map.
export default connect(mapStateToProps,mapDispatchToProps)(LogoutContainer)
import React,{Component,PropTypes}来自“React”
从“react redux”导入{connect}
从“./Logout”导入注销
从“./reducer”导入{logoutUser}
类LogoutContainer扩展组件{
componentDidMount(){
this.props.logoutUser();
}
render(){
返回(
)
}
}
常量mapStateToProps=(状态)=>({
IsAuthorized:state.login.IsAuthorized,
});
//只需返回一张包含您的操作的地图,并使用此.props.yourAction调用它们
const mapDispatchToProps={
注销用户
};
};
//Connect是一个函数,它获取您的状态映射和操作映射。
导出默认连接(mapStateToProps、mapDispatchToProps)(LogoutContainer)
我还将生命周期更改为didMount。您需要设置状态、重新渲染等(redux将为您执行此操作)。WillMount在这里没有意义
请再次注意,此安装程序使用redux thunk中间件。请确保在您的应用商店中对其进行了初始化。您是否应该使用props调用logoutUser()?例如:this.props.logoutUser()。我刚才才意识到您有两种类型的props,一种来自“mapstateTops”所在的state使用的是我不了解的另一套道具或道具(大多数情况下),在我的例子中是一个函数。它是在动作中创建的另一个道具。使用这个来启动动作,它与状态道具无关…我半小时前才得到这个,从我读到现在为止,它对我来说并不明显。一旦你把“this.props”位于logoutUser()函数前面,它可以工作。感谢您指出这一点。现在它更有意义了。
export const logoutUser = () =>
(dispatch, getState) => {
clearJwt()
dispatch({ type: LOGOUT_USER }) //Call the dispatcher with your action
}
import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'
import Logout from './logout'
import { logoutUser } from './reducer'
class LogoutContainer extends Component {
componentDidMount() {
this.props.logoutUser();
}
render() {
return (
<Logout />
)
}
}
const mapStateToProps = (state) => ({
isAuthorised: state.login.isAuthorised,
});
//Just return a map with your actions and call them with this.props.yourAction
const mapDispatchToProps = {
logoutUser
};
};
//Connect is a function that takes your state map and your actions map.
export default connect(mapStateToProps,mapDispatchToProps)(LogoutContainer)