如何使用 redux(开源项目)让根组件在 react-native 中重新渲染
How to get root component to re-render in react-native with redux (Open source project)
当使用 redux 时,你如何让 React-Native (Expo.io) 中的根组件在状态变化时重新渲染?
我正在尝试让 <FormattedWrapper locale='en' messages={messages}>
在状态更改时更新 "locale"。
我试图在构造函数中有一个局部状态,使用 store.getState()。language.language,有一个局部变量由于来自 redux 的订阅函数而在 ComponentWillUpdate 中得到更新,但没有任何作用。
我已经把它全部清理干净,并向我想贡献的 repo 做了一个 PR:https://github.com/ipeedy/react-native-boilerplate/pull/3
App.js代码在这里:
import React, { Component } from 'react';
import { StatusBar, Platform } from 'react-native';
import { Provider } from 'react-redux';
import { ThemeProvider } from 'styled-components';
import styled from 'styled-components/native';
import { FormattedWrapper } from 'react-native-globalize';
import messages from './Messages';
import store from './store';
import Navigator from './Navigator';
import { colors } from './utils/constants';
const Root = styled.View`
flex: 1;
background-color: ${props => props.theme.PINK_50};
`;
const StatusBarAndroid = styled.View`
height: 24;
background-color: ${props => props.theme.PINK_200};
`;
class App extends Component {
render() {
return (
<Provider store={store}>
<ThemeProvider theme={colors}>
<FormattedWrapper locale='en' messages={messages}>
<Root>
<StatusBar barStyle='light-content' backgroundColor='transparent' translucent />
{ Platform.OS === 'android' && Platform.Version >= 20 ? <StatusBarAndroid /> : null }
<Navigator />
</Root>
</FormattedWrapper>
</ThemeProvider>
</Provider>
);
}
}
export default App;
在此先感谢您的帮助! :)
由于您已经在使用 react-redux
,因此您可以使用同一库的 connect
函数。
由于 Connect 需要您正在使用的组件的新实例,因此可以如下所示完成。
首先,您需要为您的供应商内部的内容制作一个单独的组件,并connect
它与商店
例如根据我在你的代码中的理解
import { Provider, connect } from 'react-redux';
class RootContainer extends Component {
render() {
const {locale} = this.props
return (
<ThemeProvider theme={colors}>
<FormattedWrapper locale={locale} messages={messages}>
<Root>
<StatusBar barStyle='light-content' backgroundColor='transparent' translucent />
{ Platform.OS === 'android' && Platform.Version >= 20 ? <StatusBarAndroid /> : null }
<Navigator />
</Root>
</FormattedWrapper>
</ThemeProvider>
);
}
}
const mapState = state = ({
locale: state.language.language
})
ConnectedRootContainer = connect(mapState, null)(RootContainer);
class App extends Component {
render() {
return (
<Provider store={store}>
<ConnectedRootContainer/>
</Provider>
);
}
}
export default App;
或者另一种简单的方法是为 <FormattedWrapper/>
创建 连接组件
当使用 redux 时,你如何让 React-Native (Expo.io) 中的根组件在状态变化时重新渲染?
我正在尝试让 <FormattedWrapper locale='en' messages={messages}>
在状态更改时更新 "locale"。
我试图在构造函数中有一个局部状态,使用 store.getState()。language.language,有一个局部变量由于来自 redux 的订阅函数而在 ComponentWillUpdate 中得到更新,但没有任何作用。
我已经把它全部清理干净,并向我想贡献的 repo 做了一个 PR:https://github.com/ipeedy/react-native-boilerplate/pull/3
App.js代码在这里:
import React, { Component } from 'react';
import { StatusBar, Platform } from 'react-native';
import { Provider } from 'react-redux';
import { ThemeProvider } from 'styled-components';
import styled from 'styled-components/native';
import { FormattedWrapper } from 'react-native-globalize';
import messages from './Messages';
import store from './store';
import Navigator from './Navigator';
import { colors } from './utils/constants';
const Root = styled.View`
flex: 1;
background-color: ${props => props.theme.PINK_50};
`;
const StatusBarAndroid = styled.View`
height: 24;
background-color: ${props => props.theme.PINK_200};
`;
class App extends Component {
render() {
return (
<Provider store={store}>
<ThemeProvider theme={colors}>
<FormattedWrapper locale='en' messages={messages}>
<Root>
<StatusBar barStyle='light-content' backgroundColor='transparent' translucent />
{ Platform.OS === 'android' && Platform.Version >= 20 ? <StatusBarAndroid /> : null }
<Navigator />
</Root>
</FormattedWrapper>
</ThemeProvider>
</Provider>
);
}
}
export default App;
在此先感谢您的帮助! :)
由于您已经在使用 react-redux
,因此您可以使用同一库的 connect
函数。
由于 Connect 需要您正在使用的组件的新实例,因此可以如下所示完成。
首先,您需要为您的供应商内部的内容制作一个单独的组件,并connect
它与商店
例如根据我在你的代码中的理解
import { Provider, connect } from 'react-redux';
class RootContainer extends Component {
render() {
const {locale} = this.props
return (
<ThemeProvider theme={colors}>
<FormattedWrapper locale={locale} messages={messages}>
<Root>
<StatusBar barStyle='light-content' backgroundColor='transparent' translucent />
{ Platform.OS === 'android' && Platform.Version >= 20 ? <StatusBarAndroid /> : null }
<Navigator />
</Root>
</FormattedWrapper>
</ThemeProvider>
);
}
}
const mapState = state = ({
locale: state.language.language
})
ConnectedRootContainer = connect(mapState, null)(RootContainer);
class App extends Component {
render() {
return (
<Provider store={store}>
<ConnectedRootContainer/>
</Provider>
);
}
}
export default App;
或者另一种简单的方法是为 <FormattedWrapper/>