代码之家  ›  专栏  ›  技术社区  ›  user3348410

基于redux状态有条件地调用组件中的函数的方式和位置

  •  1
  • user3348410  · 技术社区  · 5 年前

    我有一个组件,在我的组件中我有一些子组件。

    在父组件中,我有一些函数,我想从子组件触发它。所以我和雷德克斯一起去。

    它是我的父组件:

       import React, { Component } from "react";
        import { withRouter } from "react-router-dom";
        import { bindActionCreators } from "redux";
        import { splashStop } from "store/actions/Home/splashStop";
    
    import { connect } from "react-redux";
    
    class Home extends Component {
      constructor(props) {
        super(props);
        this.state = {
        };
        this.goPage = this.goPage.bind(this);
      }
    
      componentDidMount() {
      }
    
      goPage = () => {
         this.props.history.push("/agencies");
      };
    
      render() {
        if (this.props.homeSplash.splashStart == true) {
          myTime.play();
        }
        return (
          <div>
             <ChildComponent />
          </div>
        );
      }
    }
    
    const mapStateToProps = state => ({
      homeSplash: state.homeSplash
    });
    
    function mapDispatchToProps(dispatch) {
      return {
        splashStop: bindActionCreators(splashStop, dispatch)
      };
    }
    
    export default connect(
      mapStateToProps,
      mapDispatchToProps
    )(withRouter(Home));
    

    这是我的孩子部分:

    下面是我在onClick函数的子组件中分派redux操作:

      triggerSplash = () => {
        this.props.splashStart();
      };
    

    我的行动:

    导出const START_SPLASH= “开始飞溅”;

    export const splashStart = () => {
        return dispatch => {
            dispatch({
                type: START_SPLASH,
                payload: true
              });
        };
      };
    

    还有我的减速机:

    import { START_SPLASH } from "store/actions/Home/splashStart";
    
    let initialState = {
      splashStart: false
    };
    
    export default (state = initialState, action) => {
      switch (action.type) {
        case START_SPLASH:
          return { ...state, splashStart: action.payload };
        default:
          return state;
      }
    };
    

    我的减速器,动作正常。

    我在想为什么 myTime.play(); 总是在组件安装时工作,只是不关心此控件:

    if (this.props.homeSplash.splashStart == true) {
              myTime.play();
            }
    

    我放错地方了还是怎么了?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Bob    5 年前

    在你的redux结构中,似乎一切正常。但是你也应该提供你的childComponent来让它更清晰。
    如果已在子组件中正确连接了redux操作,请尝试以下操作:

    <button ... onClick={() => this.triggerSplash()}>Click</button>
    

    将箭头函数放入 onClick . 因为在组件初始化中,所有组件函数都在呈现时自动调用。