首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React-redux学习

React-redux学习
EN

Stack Overflow用户
提问于 2020-08-04 22:40:01
回答 2查看 54关注 0票数 0

)

我目前正在学习React和Redux。我正在编写我的第一个应用程序,这是一个电梯模拟器。目标很简单。键盘允许用户选择楼层。选择后,将在仪表板上显示一条消息。延迟一段时间后,电梯应该移动到请求的楼层(尚未实现)。将显示一条消息,用于在移动过程中监控电梯的当前位置(尚未实现)。

目前的问题是,当我点击一个按钮时,状态没有更新,我不明白为什么:-(。如果有人能指出我哪里错了,非常感谢!

仪表板代码

代码语言:javascript
复制
import React from 'react';
import { connect } from "react-redux";
import { Container, Row, Col } from 'react-bootstrap';


const mapStateToProps = state => {
    return {
        elevator: state.elevator
        , inMove: state.inMove
    };
}

const ConnectedDashboard = ({ elevator, inMove }) => {
    return (
        <Container>
            <Row>
                <Col>Current position: {elevator.position}, floor selected: {elevator.floor_selected}, in move: {inMove.toString()} </Col>
            </Row>
        </Container>
        )
};

const Dashboard = connect(mapStateToProps)(ConnectedDashboard);

export default Dashboard;

键盘代码

代码语言:javascript
复制
import React, { Component } from 'react';
import { connect } from "react-redux";
import Button from 'react-bootstrap/Button';
import Form from 'react-bootstrap/Form';

import { floorSelected } from '../Action/action';




function mapDispatchToProps(dispatch) {
    return {
        floorSelected: floor => dispatch(floorSelected(floor))
    };
}

const mapStateToProps = state => {
    return {
        elevator: state.elevator
        , inMove: state.inMove
    };
}


class ConnectedKeyboard extends Component {
    constructor(props) {
        super(props);
        this.state = {
            elevator: { position: 0, floor_selected: 0 }
            , inMove: false
        };

        this.handleSubmit = this.handleSubmit.bind(this);
    }

    handleSubmit(event) {
        event.preventDefault();
        this.props.floorSelected(event.target.value);
        this.setState({ elevator: { position: 0, floor_selected: event.target.value }, inMove: false })
    }

    render() {
        return (
            <Form>
                <Button variant="primary" type="submit" value="0" onSubmit={this.handleSubmit} >
                    0
      </Button>
                <Button variant="primary" type="submit" value="1" onSubmit={this.handleSubmit} >
                    1
      </Button>
                <Button variant="primary" type="submit" value="2" onSubmit={this.handleSubmit} >
                    2
      </Button>
                <Button variant="primary" type="submit" value="3" onSubmit={this.handleSubmit} >
                    3
      </Button>
                <Button variant="primary" type="submit" value="4" onSubmit={this.handleSubmit} >
                    4
      </Button>
                <Button variant="primary" type="submit" value="5" onSubmit={this.handleSubmit} >
                    5
      </Button>
                <Button variant="primary" type="submit" value="6" onSubmit={this.handleSubmit} >
                    6
      </Button>
                <Button variant="primary" type="submit" value="7" onSubmit={this.handleSubmit} >
                    7
      </Button>
                <Button variant="primary" type="submit" value="8" onSubmit={this.handleSubmit} >
                    8
      </Button>
                <Button variant="primary" type="submit" value="9" onSubmit={this.handleSubmit} >
                    9
      </Button>
            </Form>
        );
    }
}

const Keyboard = connect(mapStateToProps, mapStateToProps)(ConnectedKeyboard);

export default Keyboard;

应用程序的其他元素。在应用程序中,这些元素位于不同的文件中

代码语言:javascript
复制
// App
import React from 'react';
import Keyboard from './Components/Keyboard';
import Dashboard from './Components/Dashboard';
import { Provider } from 'react-redux';
import store from './store';


import { createStore, combineReducers } from 'redux';
import { reducer as formReducer } from 'redux-form';

function App() {
    return (
        <Provider store={store}>
            <Dashboard />
            <Keyboard />
        </Provider>
    );
}

export default App;


// Store
import { createStore } from "redux";
import rootReducer from "./Reducer/rootReducer";

const store = createStore(rootReducer);

export default store;

// Action
import { FLOOR_SELECTED } from '../Constants/action-type';

export function floorSelected(payload) {
    return { type: FLOOR_SELECTED, payload }
};

// Constants
export const FLOOR_SELECTED = "FLOOR_SELECTED";



// Reducers
import { FLOOR_SELECTED } from '../Constants/action-type';

const initialState = {
    elevator: { position: 0, floor_selected: 0 }
    , inMove: false
};


function rootReducer(state = initialState, action) {
    if (action.type === FLOOR_SELECTED) {
        return Object.assign({}, state, {
            elevator: action.payload
        });
    }
    return state;
};

export default rootReducer;
EN

回答 2

Stack Overflow用户

发布于 2020-08-05 00:15:36

您未在此处将派单添加到您的连接:

连接常量键盘=

(mapStateToProps,mapStateToProps)(ConnectedKeyboard);

你正在使用mapStateToProps两次,你也需要mapDispatchToProps在里面。

根据react-redux docsfunction connect(mapStateToProps?, mapDispatchToProps?, mergeProps?, options?)

票数 0
EN

Stack Overflow用户

发布于 2020-08-05 17:20:39

按照Doug的建议修改连接函数后,我修改了Keyboard.js中的handleSubmit函数

代码语言:javascript
复制
handleSubmit(event) {
        console.log("handleSubmit call...");
        event.preventDefault();
        this.props.floorSelected(event.nativeEvent.submitter.value);
        this.setState({ elevator: { position: 0, floor_selected: event.nativeEvent.submitter.value }, inMove: false })
    }

和减速机

代码语言:javascript
复制
function rootReducer(state = initialState, action) {
    console.log("rootReducer call...");
    console.log(action.type);
    if (action.type === FLOOR_SELECTED) {
        return Object.assign({}, state, {
            elevator: {
                position: state.elevator.position
                , floor_selected: action.payload
            }
        });
    }
    return state;
};

但我仍然不明白的是,在handleSubmit中,为什么要先调用reducer,然后再调用setState?我想说这一行是不需要的。我把它注释掉了,我得到了同样的行为。你觉得呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63249248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档