SolidJs之异步

385 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

懒加载组件

大多数打包器在使用动态导入时会自动进行代码分割处理。solid的lazy方法允许包含组件的动态导入来实现延迟加载。然后输出一个可以在jsx模版中正常使用的组件,它会在第一次渲染时在内部动态加载底层导入的代码,此时会暂停渲染分支直到代码可用。 原:

import Greeting from "./greeting";

如:

import { render } from "solid-js/web";
import { lazy } from "solid-js";

const Greeting = lazy(() => import("./greeting"));

function App() {
  return (
    <>
      <h1>Welcome</h1>
      <Greeting name="Jake" />
    </>
  );
}

render(() => <App />, document.getElementById("app"));

使用lazy工具函数包住需要异步加载的组件。

资源

resource是专门用于异步加载的特殊signal。可以做到异步不再阻塞执行。 如: const [user] = createresource(userId,fetchuser) 它由userId响应式驱动,当数据发生变化时,会调用fetchuser方法。事实上,该方法可以是任意内容,只要保证是promise驱动的即可。生成的 Resource Signal,还包含响应式 loading 和 error 属性,可以根据当前状态轻松控制我们的视图。 从createResource返回的第二个值包含一个mutate方法,用于直接更新内部signal,另外一个refetch方法,即使源没有改变,也可以用它来重新加载当前查询请求。

const [user, { mutate, refetch }] = createResource(userId, fetchUser);

lazy 在内部使用 createResource 来管理其动态导入。

transition

solidjs提供了一个usetransition()的hooks,返回一个挂起的信号指示器和一个开始过渡(transition)的方法,这两个返回值囊括了我们的状态更新。

const [pending, start] = useTransition(); const updateTab = (index) => () => start(() => setTab(index));

我们应该使用挂起状态的signal在ui中添加一个状态指示器。可以在选项卡容器div上添加一个表示挂起的class,如:

<div class="tab" classList={{ pending: pending() }}>