![](/img/trans.png)
[英]How to use react hooks on react-native with react-navigation
[英]How to properly use redux with react-native navigation
我一直在尝试使用react-native-router-flux进行设置并按照步骤进行操作。 然后尝试按照示例进行操作,并记录大量信息以尝试对其进行反向工程。 然而,即使遵循我可以找到的所有信息,我最终得到了一些奇怪的状态结构:
scene
是包含路由器状态的对象。 但是,初始状态在scene
内复制(因此它再次包含devices
和rooms
对象)。
如果我更改普通状态设备或路由,则会抛出错误: Key <name of the key> has already been defined
(其他人在此报告相同的问题)。
所以我的问题是:你如何使用redux路由你的本机应用程序? 你使用其他图书馆吗? 我可以使用任何示例或文档资源来修复我的代码吗?
认为它具有典型的redux结构。 为了示例,这是它在我的app/index.js
上的外观:
import React, { Component } from 'react'
import { Router, Scene } from 'react-native-router-flux'
import { createStore, applyMiddleware, compose } from 'redux'
import { Provider, connect } from 'react-redux'
import logger from 'redux-logger'
import reducers from './reducers'
import Home from './components/home'
import Device from './components/devices'
import Login from './components/login'
const middleware = [logger()]
const store = compose(
applyMiddleware(...middleware)
)(createStore)(reducers)
const RouterWithRedux = connect(reducers)(Router)
export default class AppContainer extends Component {
render () {
return (
<Provider store={store}>
<RouterWithRedux>
<Scene key='login' component={Login} title='Login' />
<Scene key='root' initial={true}>
<Scene key='home' component={Home} title='Home' />
<Scene key='device' component={Device} title='Device' />
</Scene>
</RouterWithRedux>
</Provider>
)
}
}
根据我的痛苦经历,如果你把它包装在一个Provider
并且从redux
监听更新,就没有办法阻止Router
重新渲染,这是设计的本质。
如何防止这种情况,是: Router
应该渲染一次,只需一次就意味着:
如果您根本没有连接到redux,它可以正常工作,因为您的Router
不会被redux的任何更新触发。
另外,你可以connect()
Router
到redux
来获取一个dispatch()
方法道具,但你不能听另一个道具。
因此,架构将是:
import {
Router,
Scene,
Actions,
} from 'react-native-router-flux';
// --- child component can connect and listen to props they want.
const myConnectedMainConponent = connect()(myMainConponent);
const myConnectedLoginConponent = connect()(myLoginConponent);
// --- Create it via Actions.create(), or it will be re-created for each render of your Router
const scenes = Actions.create(
<Scene key="root">
<Scene key="login" component={myLoginConponent} />
<Scene key="main" component={myMainConponent} />
</Scene>
);
// --- Create connected Router if you want dispatch() method.
// --- Or you can just use vanilla Router
const myConnectedRouter = connect()(Router);
// --- your exported main router
export default class MyExportedRouter extends React.Component {
constructor(props) {
super(props);
};
render() {
return (
<Provider store={store}>
<myConnectedRouter scenes={scenes} />
</Provider>
);
}
}
ps我直接输入上面的代码,请注意语法错误:)
采取的点:
Router
应该只渲染一次(连接只获取调度方法或根本不连接) =====================
这最初是在https://github.com/aksonov/react-native-router-flux/issues/376#issuecomment-241965769上回复的
感谢@jsdario在这里提一下,希望这会有所帮助
我只使用redux
和react-redux
。 使用带有一些中间件的createStore
创建商店(在执行combineReducers
):
const store = createStore(
rootReducer,
compose(applyMiddleware(thunk, promiseMiddleware())),
);
注册应用:
AppRegistry.registerComponent('app', () => () => (
<Provider store={store}>
<MainComponent />
</Provider>
));
在组件中使用state:
const mapStateToProps = (state) => ({
isLoading: state.core.isLoading,
});
使用connect
组件连接到状态:
export default connect(mapStateToProps)(HomeScene);
您现在也可以直接从react-native使用NavigationExperimental
。
您可以在此链接上找到更多相关信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.