javascript - React - 在渲染页面之前获取数据

标签 javascript reactjs redux react-redux

我遇到了一种情况,我需要在 componentWillMount() 中获取更新的 props

我的布局:

@connect((store) => {
 //console.log(store);
 return {
       element: store.elements.elements,
       connections: store.connections.connections,
       attributes: store.attributes.attributes,
       media: store.media.media,
       places: store.places.places,
       user: store.user.user
 };
})

export default class Layout extends React.Component {

    componentWillMount() {
        this.props.dispatch(fetchUser())
    }

    componentWillReceiveProps(nextProps) {
        this.props.dispatch(updateStoreUser(nextProps.user))
    }

    shouldComponentUpdate(nextProps) {
        console.log(nextProps);
        return true;
    }

  render() {
    const { location } = this.props;

    return (
          <div className="main-container">
              <Header/>
              <NavConnector/>
              {this.props.children}
          </div>
    );
  }
}

{this.props.children} 将根据路由渲染页面。

我有一个 BasicInfo 组件:

componentWillMount() {
    console.log(this.props);        
    this.props.dispatch(fetchPlaces(1))
}

我需要将用户ID传递给fetchPlaces,像这样this.props.dispatch(fetchPlaces(this.props.user.id)

但是 this.props 还没有 user.id,在我正在更新商店的布局的 componentWillReceiveProps 中,但在 BasicInfo 的 componentWillMount() 之后更新> 组件被调用。

控制台日志:

enter image description here

更新

我有一个用于 BasicInfo 的连接器,渲染方法内的 this.props.user 始终未定义。但商店现在已经有了用户值(value)。

有什么办法可以从Layout中传递数据吗? {this.props.children} 被调用的地方?因为这是调用 BasicInfoConnector 的地方。

import React from "react"
import * as Redux from 'react-redux';
import Basicinfo from "./Basicinfo"

const mapStateToProps = function (store) {
    return {
        elements: store.elements.elements,
        places: store.places.places,
        geocode : store.geocode.geocode,
        user : store.user.user
    };
};

class BasicinfoConnector extends React.Component{

  render() {
      console.log(this.props.user);
    return (
        <BasicInfoConnector elements={this.props.elements} places={this.props.places} geocode={this.props.geocode} user={this.props.user}/>
    );
  }
}

export default Redux.connect(mapStateToProps)(BasicinfoConnector);

客户端JS

import React from "react"
import ReactDOM from "react-dom"
import { Router, Route, IndexRoute, hashHistory } from "react-router"
import { Provider } from "react-redux"
import { useScrollToTop } from "scroll-behavior"
import store from "./store"

import '../styles/sass/master/global.scss'

import Layout from "./components/Layout";
import Alerts from "./components/Dashboard/Alerts/Alerts"
import AttributesConnector from "./components/Dashboard/Attributes/AttributesConnector"
import BasicInfoConnector from "./components/Dashboard/Basicinfo/BasicinfoConnector"
import ConnectionsConnector from "./components/Dashboard/Connections/ConnectionsConnector"
import MediaConnector from "./components/Dashboard/Media/MediaConnector"
import Stats from "./components/Dashboard/Stats/Stats"

const app = document.getElementById('app')

ReactDOM.render(
    <Provider store={store}>
        <Router histroy={hashHistory} onUpdate={() => window.scrollTo(0, 0)}>
            <Route path="/" component={Layout}>
                <IndexRoute component={BasicInfoConnector}></IndexRoute>
                <Route path="location" component={BasicInfoConnector}></Route>
                <Route path="alerts" component={Alerts}></Route>
                <Route path="attributes" component={AttributesConnector}></Route>
                <Route path="connections" component={ConnectionsConnector}></Route>
                <Route path="media" component={MediaConnector}></Route>
                <Route path="stats" component={Stats}></Route>
            </Route>
        </Router>
    </Provider>,
app);

最佳答案

假设您想要获取 componentWillMount 中的位置,唯一的解决方案是在用户 ID 可用之前根本不使用条件渲染来渲染组件,因为 componentWillMount 仅被调用一次。像这样的事情:

{this.props.user?<BasicInfo />:null}

更新:

您需要导出一个连接(订阅)到 redux store 的组件。您正在导出尚未连接的组件。只需删除组件声明之前的导出默认值

class BasicinfoConnector extends React.Component    

并在连接语句之前添加导出默认值。

export default Redux.connect(mapStateToProps)(BasicinfoConnector);

这应该可以解决您的问题。

关于javascript - React - 在渲染页面之前获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41511519/

相关文章:

javascript - 在 raphael.js 中为逆时针圆弧设置动画

javascript - redux-form 如何在输入字段中具有初始值

javascript - 使用 React.StrictMode 标签将 React-Redux 添加到 React 应用程序

javascript - 如何在 redux 框架中使用 Action 和 Reducer 记录响应时间

reactjs - 我们能否组合不同的 Redux 应用程序来创建一个更大的应用程序?

javascript - 使用 VBA 自动化关闭 JavaScript 警报

javascript - 单击提交按钮时使用关闭按钮使文本可清除

javascript - 通过应用程序登录谷歌帐户

javascript - React - 子组件能否将值发送回父表单

javascript - Webpack、React JSX、Babel : Module build failed, "unexpected token"为空?