“无状态”组件中的上下文?

时间:2016-03-08 11:24:49

标签: reactjs

我在组件中有以下代码,我希望无状态组件访问这部分代码:

主要组成部分:

function createApp(store, communityIds) {
const App = React.createClass({

    childContextTypes: {
        localizedString: React.PropTypes.func,
    },

    getChildContext: function() {
        return {
            localizedString: function(key, fallback) {
                return getKey(key, fallback);
            },
        };
    },

    render: function() {
        return (
            <Provider store={store}>
                <Client communityIds={communityIds}/>
            </Provider>
        );
    },
});

return <App/>;
}

无状态:

export default () => (dispatch, getState) => {
    const state = getState();

    const token = state.user.get('token');

    if (!token) {
        throw new Error('test'); // this.context.localizedString does not work
    }
}

5 个答案:

答案 0 :(得分:28)

根据您的“无状态:”功能定义提供的功能不是无状态功能。您已将动作创建者视为thunk。我假设您想要为您的客户端组件插入代码。要访问无状态组件中的上下文,您的客户端组件将执行类似这样的操作(记录为here

const Client = (props, context) => {   
    return  <div >{context.localizedString("someKey", "someFallback")} </div>
}

Client.contextTypes = {
    localizedString: React.PropTypes.func
}

export default Client

答案 1 :(得分:9)

使用无状态组件的第二个参数

const MyStatelessComponent = (props, context) => { 
   const onGoButtonClick = () => {
      context.router.push('https://www.google.co.in');
   };

   return(
      <div>
         <button onClick={() => onButtonClick()}>
            {props.buttonName}
         </button>
      </div>
   );
}

MyStatelessComponent.propTypes = {
   buttonName: PropTypes.string.isRequired,
};

MyStatelessComponent.contextTypes = {
   router: React.PropTypes.object.isRequired,
};

export default MyStatelessComponent;

答案 2 :(得分:1)

另一种解决方案是自我调用功能:

export default (Component=>(
  Component.contextTypes = {
    localizedString: React.PropTypes.func
  }) && Component
)((props, context)=>{
  return  <div>{context.localizedString("someKey", "someFallback")}</div>
})

或者,如果您单独定义contextTypes以重复使用它,您可以执行以下操作:

//addContextTypes.js
export default function(Component){
  return (Component.contextTypes = {
    localizedString: React.PropTypes.func
  }) && Component
}

//component.jsx
import addContextTypes from './addContextTypes'
export default addContextTypes((props, context)=>{
  return  <div>{context.localizedString("someKey", "someFallback")}</div>
})

答案 3 :(得分:1)

我有同样的问题。现代方式(2019年)是使用钩子useContext(contextName)。文件:https://reactjs.org/docs/hooks-reference.html#usecontext

  const dumbComp = (props) => { 
       const context = useContext(contextName);
          return(
             <div>
             ...
          </div>
       );
    }

答案 4 :(得分:0)

我有同样的问题,但是在Expo SDK 32上,这意味着我无权使用钩子。

这是我的实现方式:

import { reduxForm } from 'redux-form'
import { ReduxFormContext } from 'redux-form/lib/ReduxFormContext'

const ShowFormName = () => (
  <ReduxFormContext.Consumer>
    {
      ({ form }) => <Text>{form}</Text>
    }
  </ReduxFormContext.Consumer>
)

export default reduxForm({ form: 'formName' })(ShowFormName)