当前位置: 首页 > 面试题库 >

是否可以仅在react-router过渡时仅重新安装新的子组件

柳坚白
2023-03-14
问题内容

我在应用程序中使用react-router,并且正在寻找一种方法来停止重新安装DOM中已经存在的组件。例如,如果我在URL
dashboard,那么我将有一个关联的DashboardComponent挂载。当我过渡到DOM时,dashboard/settingsDashboardComponentSettingsComponent将其重新安装到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总是在组件key更改时卸载并重新安装组件,这就是该属性的目的,以帮助React维护组件的“身份”。特别是,在使用React的CSS过渡时,这是必需的,因为使一个组件具有动画效果并在另一个组件中进行动画效果的唯一方法是使它们成为单独的DOM节点。

因为您传递{key: this.context.router.getCurrentPath()}handler内部Apphandler组件,所以即使它是相同类型,React也将卸载并重新安装该组件,任何时候都getCurrentPath()将返回不同的值。解决办法是找到当你改变的关键
希望动画,但停留否则相同。



 类似资料:
  • 我试图在两个页面之间切换,但在学习时遇到了许多问题 在我的中,有一个底部,单击该底部可将我导航到。 在我的购物车组件中,还有一个类似的按钮,navigtaes会将我返回到组件。 My index.js包含两个组件,app js是默认组件。 现在,它们在许多层面上都是真正的缺陷: 1:当我单击show cart时,而不是渲染新视图。购物车组件在视图顶部呈现,应用程序仍然呈现。 2:单击Show Ca

  • 应用: 带有两个文本输入字段(input1、input2)的搜索栏 三个按钮:SearchX、SearchY、Clear Results 两个搜索都可以将input1和input2作为参数,以得到两个不同的结果。 有一个结果组件,它接受输入、操作,并根据操作呈现搜索组件。 问题: 我们希望只有在单击按钮时才启动搜索。使用下面的代码,在第一个搜索结果之后,只要您更改输入,结果组件就会预期地重新呈现,

  • 问题内容: 我想让docker CLI连接到远程守护程序,但是我是否需要在本地计算机上安装包括守护程序在内的整个引擎? 问题答案: 如果要在Linux上安装Docker,则在最新的1.12.0版本中,Docker守护程序和Docker客户端位于单独的二进制文件中。 在发行日志中已经提到了这一点: 将二进制文件拆分为两个:docker(客户端)和dockerd(守护程序)#20639 如果要在Mac

  • 问题内容: 可以说我有一个具有条件渲染的视图组件: MyInput看起来像这样: 可以说是真的。每当我将其切换为false并渲染另一个视图时,都只会重新初始化。还会从中预填充值(如果条件更改之前已给出值)。 如果我将第二个渲染例程中的标记更改为如下所示: 似乎一切正常。看起来React只是无法区分’职位-头衔’和’失业原因’。 请告诉我我做错了什么… 问题答案: 可能发生的事情是React认为在渲

  • 问题内容: 我正在使用Spring Roo,使用Spring MVC和JPA来实现MySQL数据库的持久性。总的来说,我对Spring MVC和Java还是很陌生,但是已经使用CakePHP和Rails。 我有一个除密码外还包含个人详细信息的实体。诸如此类(不包括其他.aj文件中许多Roo生成的功能): 然后,我在控制器中执行了一个编辑操作,该操作是根据Roo自动生成的脚手架创建的以下约定: 再次

  • 问题内容: 我尝试搜索,但没有找到明确的答案。在Windows Server 2016上,没有实际安装Chrome浏览器。我下载了正确的“ chromedriver.exe”并将其放置在“ D:\ Apps \ chromedriver.exe”中。我已将完整路径添加为“ D:\ Apps \ chromedriver.exe”到我的环境PATH中。 当我尝试启动使用最新Selenium的Wind