Javascript 在Redux中更改存储
我需要改变Redux的“全局”状态(我相信它被称为存储)。这是我的代码: 减速器Javascript 在Redux中更改存储,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我需要改变Redux的“全局”状态(我相信它被称为存储)。这是我的代码: 减速器 export const user = (state = {}, action) => { console.log(4); console.log(action.type) console.log(action.payload) switch (action.type) { case C.SET_USER: console.log(act
export const user = (state = {}, action) => {
console.log(4);
console.log(action.type)
console.log(action.payload)
switch (action.type) {
case C.SET_USER:
console.log(action.payload);
return action.payload;
case C.CLEAR_USER:
return action.payload;
default:
return state;
}
};
行动:
export const setUser = (user = {}) => {
console.log(user);
return {
type: C.SET_USER,
payload: user,
}
};
呼吁采取行动:
const user = {test:true};
setUser(this.state.user);
但是如果我运行这段代码,它就会失败,并且不会调用reducer。它调用动作,但不调用减速机。我错过了什么
我当前的app.js代码:
export default class App extends Component {
constructor(p) {
super(p);
this.state = {user: null};
}
setUser = () => {
const {uid} = firebase.auth().currentUser;
firebase.database().ref('Users').child(uid).on('value', r => {
const user = r.val();
this.setState({user: user});
console.log(this.state.user);
setUser(this.state.user);
});
};
componentWillMount() {
if (firebase.auth().currentUser) {
this.setUser();
}
firebase.auth().onAuthStateChanged(async () => {
console.log('authChanged');
if (!firebase.auth().currentUser) {
return null;
}
this.setUser();
});
}
render() {
return (
<div className="App">
<Nav/>
</div>
);
}
}
导出默认类应用程序扩展组件{
建造师(p){
超级(p);
this.state={user:null};
}
setUser=()=>{
const{uid}=firebase.auth().currentUser;
firebase.database().ref('Users').child(uid).on('value',r=>{
const user=r.val();
this.setState({user:user});
console.log(this.state.user);
setUser(this.state.user);
});
};
组件willmount(){
if(firebase.auth().currentUser){
这是setUser();
}
firebase.auth().onAuthStateChanged(异步()=>{
log('authChanged');
如果(!firebase.auth().currentUser){
返回null;
}
这是setUser();
});
}
render(){
返回(
);
}
}
setUser
必须被分派,而不是简单地调用:
但这并不是真正的反应方式,您最好在函数中使用组件道具直接分派动作。大致如下:
import { setUser } from 'store/user';
// ...
class UserComponent extends React.Component {
// ...
someMethod() {
this.props.setUser(user);
}
}
export default connect(
null,
({setUser: setUser})
)(UserComponent);
这允许您的React组件以优化且无bug的方式链接到Redux商店。这也是大多数开发人员使用的方式,因此您可能会在这方面找到很多文档。示例:您连接的组件,您希望在其中使用redux的
setUser
操作
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { setUser} from '../../actions';
class YourComponent extends Component {
render(){
// now your redux action is passed to component as prop
// and you can use it like
this.props.setUser(some-user);
return()
}
}
export default connect(null, {setUser})(YourComponent);
首先,您必须调度操作以更改状态,其次,您必须将组件连接到存储 将组件连接到应用商店的步骤
...
import { connect } from 'react-redux';
class MyComponent extends React.Component {
...
}
export default connect((store) => ({...}))
当您将组件连接到商店时,您将可以访问道具中的dispatch
功能
要分派操作,请执行以下操作:
this.props.dispatch(setUser());
我相信这叫做存储
顺便说一句,它调用store共享使用redux连接组件状态和道具的代码。我想你错过了通过道具功能调用动作。你的状态如何?您可以调用setUser(状态数据)
,您可以向我们显示状态,还是您传递了错误的用户?而是constuser={test:true};你从州里调用了一些(可能未定义)
@kumark你是对的。我的父组件仍然处于“React”形式。但是我需要组件willmount
元素才能让应用程序工作。Redux@ivica.moke中是否有替代品?控制台不会记录任何内容。它没有被调用,你调度了吗?store.dispatch(setUser(user))代码>为我工作。但是,更正确的版本没有。
this.props.dispatch(setUser());