Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Redux中更改存储_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript 在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

我需要改变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(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());