首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用React导航的React本机组件中未定义的未声明容器

使用React导航的React本机组件中未定义的未声明容器
EN

Stack Overflow用户
提问于 2019-03-08 07:56:08
回答 1查看 851关注 0票数 1

我的问题是,我想访问一个组件中的容器,但它似乎是未定义的。

undefined alert image

我使用的是Unstated,正如您所看到的,这是我在容器文件(login-tainer.js)中的代码:

代码语言:javascript
复制
import { Container } from 'unstated'
class LoginContainer extends Container {
    constructor(props){
        super(props)
        this.state = {
            stepNumber: 0,
        }
    }
}
export default new LoginContainer()

这是app.js:

代码语言:javascript
复制
import React, { Component } from 'react'
import {  createStackNavigator, createSwitchNavigator } from 'react-navigation'
import { Provider } from 'unstated'
import LoginContainer from './containers/login-container'
import Home from './screens/home'
import Splash from './screens/splash'
import Login from './screens/login'
import Intro from './screens/intro'

export default class App extends Component {
  render() {
    return (
      <Provider inject={[LoginContainer]}>          
          <AuthStack/>                            
      </Provider>
    )
  }
}

const SplashStack = createStackNavigator(...)

const AppStack = createStackNavigator(...)

const AuthStack = createStackNavigator(
  {
    Intro: { screen: Intro},
    Login: { screen: Login}
  },
  {
    headerMode: "none",
    initialRouteName: "Intro"
  }
)

const SwitchNavigator = createSwitchNavigator(...)

这就是login.js:

代码语言:javascript
复制
import React, { Component } from 'react'
import { Text, View } from 'react-native'

export default class Login extends Component {
  constructor(props){
    super(props)
  }

  render() {
    // const { state: {stepNumber} } = this.props.loginContainer
    alert(this.props.LoginContainer)
    return (
      <View>
        <Text>  someText  </Text>
      </View>
    )
  }
}

我之前尝试使用Subscribe组件将容器注入到我的应用程序中,但我得到了与这里相同的结果。

使用

  • react-native 0.58.6
  • react-navigation 2.13.0 (由于v3中的一些错误)
  • unstated 2.1.1
EN

回答 1

Stack Overflow用户

发布于 2019-03-18 01:17:07

未声明的真正伟大之处在于它的实现非常简单。只要把你的渲染组件包装在Unstated<Subscribe to></Subscribe>标签里就可以了,无论什么时候你在容器里setState(),所有Components到它的Subscribe都会用Container更新后的state属性值重新渲染。

代码语言:javascript
复制
    import React, { Component } from 'react';
    import { Text, View } from 'react-native';
    import { Subscribe } from 'unstated';

    import LoginContainer from './containers/login-container';

    export default class Login extends Component {
      constructor(props){
        super(props)
      }

      render() {
        return (
          <Subscribe to={[LoginContainer, AnotherContainer]}>
            {(container, another) => (
              <View>
                <Text>{container.state.stepNumber}</Text>
              </View>
            })
          </Subscribe>
        );
      }
    }

更新:或者用这种特别的方式来做。创建此文件后:

WithUnstated.js

代码语言:javascript
复制
import React, { PureComponent } from "react";
import { Subscribe } from "unstated";

import DefaultStore from "../store/DefaultStore";

const withUnstated = (
  WrappedComponent,
  Stores = [DefaultStore],
  navigationOptions
) =>
  class extends PureComponent {
    static navigationOptions = navigationOptions;

    render() {
      return (
        <Subscribe to={Stores}>
          {(...stores) => {
            const allStores = stores.reduce(
              (acc, v) => ({ ...acc, [v.displayName]: { ...v } }),
              {}
            );
            return <WrappedComponent {...allStores} {...this.props} />;
          }}
        </Subscribe>
      );
    }
  };

export default withUnstated;

然后像这样包装你的组件:

代码语言:javascript
复制
import React, { Component } from 'react';
import { Text, View } from 'react-native';
import { Subscribe } from 'unstated';

import LoginContainer from './containers/login-container';
import AnotherContainer from './containers/another-container';

class Login extends Component {
  constructor(props){
    super(props)
  }

  render() {
    const {LoginContainer: container} = this.props;
    return (
      <View>
        <Text>{container.state.stepNumber}</Text>
      </View>
    );
  }
}

export default withUnstated(Login, [LoginContainer, AnotherContainer])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55054708

复制
相关文章

相似问题

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