如何更新 NavigatoriOS 组件中初始路由的属性?
How to update props of initial route in a NavigatoriOS component?
这个问题是关于在多个组件之间传递数据对象的策略。
在下面的屏幕截图中,我有一个 NavigatorIOS,其初始路由为 ListComponent。它位于显示 Filters 组件的 Side-Menu 中。目前,侧边菜单 已打开,过滤器 可见。
我的目标是当用户在 Filters 中更改内容时,我想更新 ListComponent。
我可以使用单例对象来存储过滤器,但我仍然需要找到一种方法来告诉 ListComponent 它们已更改。
var defaultFilters = {
invited: true,
joined: false,
public: true,
private: false,
}
class MainTab extends Component {
constructor( props ){
super(props);
this.props.filters = defaultFilters;
}
render () {
var onFilterChange = function ( filters ) {
console.log("filters changed");
};
var filtersComponent = ( <Filters filters={this.props.filters} onFilterChange={onFilterChange.bind(this)} /> );
return (
<SideMenu menu = { filtersComponent } touchToClose={true} openMenuOffset={300} animation='spring'>
<NavigatorIOS
style={styles.container}
initialRoute={{
title: 'List',
component: ListComponent
}}
/>
</SideMenu>
);
}
}
已解决
var onFilterChange = function ( filters ) {
console.log("filters changed");
this.refs.navigator.replace({
title: 'List',
component: ListComponent,
passProps: {
filters: filters
}
});
};
<NavigatorIOS
ref='navigator'
...
/>
路由有一个 passProps
选项,它接受道具对象,所以这就是您将道具传递到导航器中的组件的方式。您可能会在 onFilterChange
中更改您的 MainTab
状态并通过 passProps
将其传递下去。或者,您可能想查看导航器上的 replace
方法。
https://facebook.github.io/react-native/docs/navigatorios.html
使用 OP,joshua-lieberman,相同的响应。
使用 Navigator
它对我有用
var onFilterChange = function ( filters ) {
console.log("filters changed");
this.refs.navigator.replace({
title: 'List',
component: ListComponent,
passProps: {
filters: filters
}
});
};
...
<Navigator
ref='navigator'
...
/>
我在componentDidMount
中使用
componentDidMount() {
this.changeInitialRoute(this.refs.navigator);
}
changeInitialRoute(navigator) {
const valet = this.props.valet;
if (valet && valet.user_id && valet.token) {
console.log('valet ready', this.props);
navigator.resetTo({title: 'Home', index: 0});
} else {
navigator.resetTo({title: 'Login', index: 0});
}
}
这个问题是关于在多个组件之间传递数据对象的策略。
在下面的屏幕截图中,我有一个 NavigatorIOS,其初始路由为 ListComponent。它位于显示 Filters 组件的 Side-Menu 中。目前,侧边菜单 已打开,过滤器 可见。
我的目标是当用户在 Filters 中更改内容时,我想更新 ListComponent。
我可以使用单例对象来存储过滤器,但我仍然需要找到一种方法来告诉 ListComponent 它们已更改。
var defaultFilters = {
invited: true,
joined: false,
public: true,
private: false,
}
class MainTab extends Component {
constructor( props ){
super(props);
this.props.filters = defaultFilters;
}
render () {
var onFilterChange = function ( filters ) {
console.log("filters changed");
};
var filtersComponent = ( <Filters filters={this.props.filters} onFilterChange={onFilterChange.bind(this)} /> );
return (
<SideMenu menu = { filtersComponent } touchToClose={true} openMenuOffset={300} animation='spring'>
<NavigatorIOS
style={styles.container}
initialRoute={{
title: 'List',
component: ListComponent
}}
/>
</SideMenu>
);
}
}
已解决
var onFilterChange = function ( filters ) {
console.log("filters changed");
this.refs.navigator.replace({
title: 'List',
component: ListComponent,
passProps: {
filters: filters
}
});
};
<NavigatorIOS
ref='navigator'
...
/>
路由有一个 passProps
选项,它接受道具对象,所以这就是您将道具传递到导航器中的组件的方式。您可能会在 onFilterChange
中更改您的 MainTab
状态并通过 passProps
将其传递下去。或者,您可能想查看导航器上的 replace
方法。
https://facebook.github.io/react-native/docs/navigatorios.html
使用 OP,joshua-lieberman,相同的响应。
使用 Navigator
它对我有用var onFilterChange = function ( filters ) {
console.log("filters changed");
this.refs.navigator.replace({
title: 'List',
component: ListComponent,
passProps: {
filters: filters
}
});
};
...
<Navigator
ref='navigator'
...
/>
我在componentDidMount
中使用componentDidMount() {
this.changeInitialRoute(this.refs.navigator);
}
changeInitialRoute(navigator) {
const valet = this.props.valet;
if (valet && valet.user_id && valet.token) {
console.log('valet ready', this.props);
navigator.resetTo({title: 'Home', index: 0});
} else {
navigator.resetTo({title: 'Login', index: 0});
}
}