Pl Vue

Router

创建路由

内置路由渲染、跳转组件,跳转函数、路由守卫。支持 SSR

渲染配置路由信息

请不要在 SSR 下使用 hash 模式,因为浏览器会自动过滤掉 hash 路由。

import { createRouter, Router, Route } from 'pl-vue/lib/router';
import Home from './pages/home';

// 初始化路由信息
createRouter({
  base: '',                      // 路由前缀
  mode: 'history',               // 路由模式 'history' | 'hash'
  ssrDataKey: 'g_initialProps',  // 服务端渲染挂载在 window 上的 key
})

function App() {
  return <Router>
    <Route path='/' component={Home} />
    <Route path='/docs' component={() => import('./pages/about')} />  {/* 按需导入,页面加载时加载文件 */}
  </Router>
}

嵌套路由

// app.tsx
import { Router, Route } from 'pl-vue/lib/router';
import About from './pages/about';
import Home from './pages/home';

function App() {
  return <Router>
    <Route path='/docs' component={About} />
    <Route path='/' component={Home} exact={false} />
  </Router>
}
// page/home.tsx
import { Router, Route, PagePropsType, Link } from 'pl-vue/lib/router';

function Home(props: PagePropsType) {
  return <div>
    <nav>
      <Link to='/sub1'>sub1</Link>
      <Link to='/sub2'>sub2</Link>
    </nav>
    <Router prefix={props.path}>
      <Route path='/sub1' component={Sub1} />
      <Route path='/sub2' component={Sub2} />
    </Router>
  </div>
}

export default Home;

页面渲染前执行函数

主要用于服务端渲染,获取到页面加载前的数据

import { PagePropsType, GetInitialPropsOption } from 'pl-vue/lib/router';

function Home(props: PagePropsType) {
  console.log(props.data);  //--> hello
  return <div>{props.data}</div>
}

Home.prototype.getInitialProps = async (option: GetInitialPropsOption) => {
  // await 异步任务
  return 'hello';
}

useRoute

获取当前路由信息

import { useRoute } from 'pl-vue/lib/router';

function App() {
  const route = useRoute();
  console.log(route);

  return <div>hello</div>
}

useRouter

import { useRouter } from 'pl-vue/lib/router';

function App() {
  const router = useRouter();

  return <div>
    <botton onclick={() => router.push('/path?id=123')}>jump</button>
    <botton onclick={() => {
      router.push({ path: '/path', query: { id: 123 }, hash: '' });
    }}>jump</button>
  </div>
}

路由守卫

import { createRouter, Router, Route, useRouter } from 'pl-vue/lib/router';

// 全局守卫
createRouter({}).beforeEach((to, from, next) => {
  console.log(to, from);
  next();
});

function App() {

  const router = useRouter();

  return <Router>
    {/* 独享守卫 */}
    <Route path='/' component={Home} beforeEnter={(to, from, next) => {
      router.relace('/aaa');
      next();
    }} />
    <Route path='/docs' component={About} />
  </Router>
}