Route

用于给组件声明路由,以清晰的表示你的组件架构。 Route 被阻止为嵌套的树状结构,当接收到新 URL 时,会使用深度优先搜索找到 路径匹配的 URL。当找到之后,所有经历过的路径都会被标记为 active,路径上的 所有组件也都会被渲染到 DOM 上,其渲染顺序与树状结构的定义顺序一致。

属性

path { String } #

用于匹配 URL 的路由,当使用 / 开头时,被认为是绝对路径, 否则认为是相对路径,将自动连接父路径。

component { Component } #

当匹配到当前路由上时匹配的组件,会被渲染为父组件的 this.props.children

  • const routes = (
     <Route path="/" component={App}>
       <Route path="groups" component={Groups} />
       <Route path="users" component={Users} />
     </Route>
    )
    
    class App extends React.Component {
     render () {
       return (
         <div>
           {this.props.children}
         </div>
       )
     }
    }
    

components { Object } #

可以定义多个命名组件,这样不会直接渲染为父组件的 children, 而是当做 props 赋给父组件。

  • const routes = (
     <Route path="/" component={App}>
       <Route path="groups" components={{main: Groups, sidebar: GroupsSidebar}} />
       <Route path="users" components={{main: Users, sidebar: UsersSidebar}}>
         <Route path=":userId" component={Profile} />
       </Route>
     </Route>
    )
    
    class App extends React.Component {
     render () {
       const { main, sidebar } = this.props
       return (
         <div>
           <div className="Main">
             {main}
           </div>
           <div className="Sidebar">
             {sidebar}
           </div>
         </div>
       )
     }
    }
    
    class Users extends React.Component {
     render () {
       return (
         <div>
           {this.props.children}
         </div>
       )
     }
    }
    

接受一个 navigator 配置对象,与 hysdk/QunarAPI 的配置方式基本相同,区别在于将类型 type 放在里面处理了。

  • const nav = {
     type: 'normal', // normal/transparent/none 支持去掉 navibar- 的缩写,也可以写 navibar-normal
     title: { style: 'text', text: '标题' },
     left: { ... },
     section: {
       left: 'header .regret', // 对应 h5 的元素,在点击 native 时,可以模拟点击 h5
       title: 'header .title$', // 在类名末尾添加 `$` 表示阻止 native 处理该事件
       $buttonsDoNotSimulate: [ 'left' ] // 阻止模拟点击的按钮,默认阻止了 'left' 按钮穿透点击 h5
     },
     // 支持三种,touchTap/tap/click,用于模拟点击 h5 header 的元素
     // 其中 touchTap 对应的是引入 onTouchTap 插件之后绑定的 onTouchTap 事件;
     // tap 对应的是 Yo 的 Touchable 组件绑定的 tap 事件(实际上是模拟 onTouchStart 和 onTouchEnd)
     // click 就是 onClick
     // 默认是 tap
     $simulateType: 'tap'
    }
    

animate { String } #

页面跳转动画,包括 moveFromRight/moveFromBottom/none,只有 hy 环境和 spa 有,多页场景下没有。 注意,在 useViewStack 设置为 false 时将不会生效。

extraClass { String } #

根组件附加类名,对 <yorouter-view> 元素添加自定义类名。 注意,在 useViewStack 设置为 false 时将不会生效。

extraStyle { String } #

根组件附加样式,对 <yorouter-view> 元素进行样式操作。 注意,在 useViewStack 设置为 false 时将不会生效。

onEnter { Function } #

配置 onEnter 回调,在进入路由前调用。三端均可使用该周期。

如果想使用三端通用的生命周期,建议使用 withRouter 中的 lifecyle,为组件绑定 activedinitedreceiveddeactived 四个生命周期。

  • <Route path="/" onEnter={() => log('enter /')}>
     <Route path="hello" onEnter={() => log('enter /hello')} />
    </Route>
    
    // 进入 /hello 页面,打印如下:
    // enter /
    // enter /hello
    

onChange { Function } #

配置 onChange 回调,在路由改变时调用。注意,只有单页应用会触发这个回调。

  • <Route path="/" onChange={() => log('onChange')}>
     <Route path="hello" />
     <Route path="test" />
    </Route>
    
    // 从 /hello 进入 /test 页面,会触发 onChange,因为 / 是两者的公共父路由,这次的变动没有退出父路由,仅仅触发了改变
    

onLeave { Function } #

配置 onLeave 回调,在离开路由时调用。注意,只有单页应用会触发这个回调。

  • <Route path="/" onLeave={() => log('enter /')}>
     <Route path="hello" onLeave={() => log('enter /hello')} />
    </Route>
    
    // 离开这两个页面,打印如下:
    // enter /hello
    // enter /
    
方法

getComponent #

component 类似,异步获取组件,用于进行代码分离。

  • <Route path="courses/:courseId" getComponent={(nextState, cb) => {
     // 异步方法获取组件
     cb(null, Course)
    }} />
    

方法参数:

参数名 类型 描述 必选 支持版本
nextState Object
callback Function

getComponents #

components 类似,异步获取组件,用于进行代码分离。

  • <Route path="courses/:courseId" getComponents={(nextState, cb) => {
     // 异步方法获取组件
     cb(null, {sidebar: CourseSidebar, content: Course})
    }} />
    

方法参数:

参数名 类型 描述 必选 支持版本
nextState Object
callback Function