javascript - 如何访问不同组件中的存储?

标签 javascript reactjs redux reducers

所以我有一个搜索栏,我用 redux 存储查询,这似乎有效。我现在尝试在结果组件中访问该查询,我将使用该组件来显示查询结果。

我尝试使用 MapStateToProps,然后在结果组件中调用 {this.props.query},但这并没有从搜索栏中获取查询更改。

商店创建:

import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import * as serviceWorker from "./serviceWorker";
import { BrowserRouter } from "react-router-dom";
import { createStore, combineReducers, applyMiddleware } from "redux";
import { userReducer } from "./redux/reducers/user-reducer";
import { searchReduer } from "./redux/reducers/search-reducer"
import logger from "redux-logger";
import { Provider } from "react-redux";

const store = createStore(
  combineReducers({
      user: userReducer,
      query: searchReducer,
  }),
  {},
  applyMiddleware(logger)
);

ReactDOM.render(
  <Provider store={store}>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </Provider>,
  document.getElementById("root")
);

serviceWorker.unregister();

搜索:

import React, {Component} from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';
import { connect } from "react-redux";
import elasticsearchUtility from "../utilities/elastic-search-utility";

const styles = theme => ({
    container: {
        display: 'flex',
        flexWrap: 'wrap',
        justifyContent: 'center',
        flexDirection: 'row',
    },
    margin: {
        margin: theme.spacing.unit,
    },
    cssLabel: {
        color: 'white',
        '&$cssFocused': {
            color: 'white',
        },
    },
    cssFocused: {
    },
    cssUnderline: {
        color: 'white',
    },
    cssOutlinedInput: {
        '&$cssFocused $notchedOutline': {
            borderColor: 'white',
        },
    },
    notchedOutline: {
        borderWidth: '1px',
        borderColor: 'white !important'
    },
});

class Search extends Component{
    state = {
        searchQuery: ""
    };

    componentDidMount() {
        elasticsearchUtility.startClient();
    }

    onChange = event => {
        this.props.updateQuery(event.target.value);
    };

    render() {
        const {searchQuery, classes} = this.props;

        return (
            <div className={this.props.classes.container}>
                <TextField
                    fullWidth={true}
                    className={classes.margin}
                    InputLabelProps={{
                        classes: {
                            root: classes.cssLabel,
                            focused: classes.cssFocused,
                        },
                    }}
                    InputProps={{
                        classes: {
                            root: classes.cssOutlinedInput,
                            focused: classes.cssFocused,
                            notchedOutline: classes.notchedOutline,
                        },
                    }}
                    onChange={this.onChange}
                    label="Service search"
                    variant="outlined"
                    id="custom-css-outlined-input"
                    value={searchQuery}
                />
            </div>
        );
    }
}
const mapStateToProps = (state) => {
    return {
        query: state.searchQuery
    }
};

const mapDispatchToProps = (dispatch) => {
    return {
        updateQuery: (query) => {
            dispatch(search(query))
        }
    }
};

function search(value) {
    return {type: "SEARCH", value};
}

Search.propTypes = {
    classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(
    connect(
        mapStateToProps,
        mapDispatchToProps
    )(Search)
);

搜索结果:

import React, {Component} from 'react';
import connect from "react-redux/es/connect/connect";

class SearchResults extends Component {

    render() {
        console.log(this.props.query);
        return (
            <div>
            <h1>Test + {this.props.query}</h1>
            </div>
        );
    }
}

function mapStateToProps(state) {
    return { query: state.searchQuery };
}

export default connect(mapStateToProps)(SearchResults)

搜索缩减器:

export const initialQuery = '';

export const searchReducer = (state = initialQuery, action) => {

    switch (action.type) {
        case "SEARCH":
            return action.value;
        default:
            return state;
    }

};

在搜索结果中,{this.props.query} 始终未定义,即使当我在搜索栏中输入文本时我可以看到 state.query 发生变化。我假设我误解了有关 Redux 的某些内容,但我不太确定是什么,因为我能够在“搜索”组件中正确更新 searchQuery。

最佳答案

看起来您在一些地方混淆了 querysearchQuery

  combineReducers({
      user: userReducer,
      query: searchReducer,
  }),

您将 state.query 设置为全局查询对象,但您的两个 mapStateToProps 都在尝试访问 state.searchQuery

此外,在 Search 的渲染中,您有 const {searchQuery, classes} = this.props;,但同样,mapStateToProps正在将 state.searchQuery 映射到 props.query,因此 props.searchQuery 未定义。

似乎您只需要确保使用正确的映射,或者选择 querysearchQuery 并在全局状态和 props 中使用它。

关于javascript - 如何访问不同组件中的存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54623416/

相关文章:

javascript - 使用 React-Router 在页面内链接

reactjs - 无法进行开玩笑测试以触发按钮 onclick

javascript - 检测 React 组件外部的点击

javascript - 如何将连接、组件和功能导出到一处? (只需要建议)

javascript - 您将在哪里使用 Closure Library 实例化嵌套组件?

javascript - 解析复杂的 Json 字符串

reactjs - 还原/ react 。您必须将组件传递给 connect 返回的函数。相反收到了未定义的

reactjs - 使用 redux-thunk 取消之前的异步操作

javascript - React.JS this.state 未定义

JavaScript 表单验证未按预期工作