【发布时间】:2015-10-27 02:35:19
【问题描述】:
我在我的应用程序中使用 react-router,我正在寻找一种方法来阻止重新挂载已经在 DOM 中的组件。例如,如果我位于 URL dashboard,那么我将安装一个关联的 DashboardComponent。当我转换到dashboard/settings 时,我的DashboardComponent 和SettingsComponent 会重新安装到DOM 中。我想找到一种干净的方法来仅安装当前 URL 的子级。这可能吗?
路由器:
import { Component, createFactory, PropTypes } from 'react'
import { Route, RouteHandler, DefaultRoute, NotFoundRoute } from 'react-router'
import Home from '../components/Home'
import Dashboard from '../components/Dashboard'
import ViewPlayers from '../components/clubs/ViewPlayers'
let route = createFactory(Route),
handler = createFactory(RouteHandler),
root = createFactory(DefaultRoute),
pageNotFound = createFactory(NotFoundRoute),
Transitions = createFactory(require('react/lib/ReactCSSTransitionGroup'));
class App extends Component {
constructor() {
super();
}
render() {
return (
Transitions({transitionName: 'fade'},
handler({key: this.context.router.getCurrentPath()})
)
)
}
}
App.contextTypes = {
router: PropTypes.func
};
let Router = (
route({path: '/', name: 'home', handler: App},
root({handler: Home}),
route({path: 'dashboard', name: 'dashboard', handler: Dashboard},
route({path: 'players', name: 'players', handler: ViewPlayers}),
)
)
);
export { Router };
仪表板(父组件):
import React from 'react'
import { RouteHandler, Link } from 'react-router'
import { _, div } from './Html'
export default
class Dashboard extends React.Component {
constructor() {
super();
this.state = {}
}
componentWillMount() {
console.log('mounted')
}
componentWillUnmount() {
}
render() {
return (
div({},
_(Link)({to: 'players'}),
_(RouteHandler)({})
)
)
}
}
注意: _ 只是 React.createFactory() 的包装器
【问题讨论】:
-
你使用的是什么版本的 React Router? AFAIK 正常的行为是让 React 做它的协调算法,默认情况下不会重新安装树中不改变类型或位置的组件。它将重新渲染组件,但不应重新安装它们。
-
也许我对它如何渲染的反应的理解是不正确的,但是在转换更改时,
componentWillMount被触发 - 这是否表明组件正在重新安装?我正在使用v 0.13 -
是的,这表明组件正在重新安装,但是如果我自己的 React Router v0.13 项目,并且只要组件保持相同并且在树,它不会重新安装。您有一些代码或可重现的示例可以分享吗?
标签: reactjs react-router