SolidJS生命周期

683 阅读2分钟

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

前言

solid只有少量的生命周期函数,所有的存活销毁都是由响应系统控制。

onMount

一般来说,有了Effect副作用,正常情况下就不需要生命周期函数了,就像react函数式组件一样。但是为了能让事情变得更容易一些,solidjs将非跟踪createEffect调用重新命名为--onMount。它和Effect是一样的,并且在组件渲染出实话就会执行,而且只运行一次。 就如这个例子一样:

import { render } from "solid-js/web";
import { createSignal, onMount, For } from "solid-js";
import "./styles.css";

function App() {
  const [photos, setPhotos] = createSignal([]);

	onMount(async () => {
		const res = await fetch(`https://jsonplaceholder.typicode.com/photos?_limit=20`);
		setPhotos(await res.json());
	});

  return <>
    <h1>Photo album</h1>

    <div class="photos">
      <For each={photos()} fallback={<p>Loading...</p>}>{ photo =>
        <figure>
          <img src={photo.thumbnailUrl} alt={photo.title} />
          <figcaption>{photo.title}</figcaption>
        </figure>
      }</For>
    </div>
  </>;
}

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

onMount发起请求获取图片,并将结果赋值给signal,且只在页面初始化执行时发起请求,后续不会在执行。

onCleanup

有时候我们需要在页面页面销毁时清除掉一些副作用,如定时器、添加监听函数等。一些框架的清理方法直接是框架的副作用或生命周期方法的返回值。但是由于solidjs渲染树的所有内容方法都存在于Effect中并且可以嵌套,因此将onCleanup设为一级方法,我们就可以在组件内部或者Effect中使用onCleanup。在自定义指令中使用onCleanup。在响应式系统同步执行的任何地方都可以使用onCleanup。 比如这个例子:

import { render } from "solid-js/web";
import { createSignal, onCleanup } from "solid-js";

function Counter() {
  const [count, setCount] = createSignal(0);

  const timer = setInterval(() => setCount(count() + 1), 1000);
  onCleanup(() => clearInterval(timer));

  return <div>Count: {count()}</div>;
}

render(() => <Counter />, document.getElementById('app'));

在组件内部定义了循环定时器setInterval,而在页面销毁时需要使用clearInterval清除掉这个定时器。