替代MapArray在删除物品时等待承诺的MapArray

发布于 2025-02-02 18:34:23 字数 1118 浏览 3 评论 0原文

我不想使用过渡组或任何多余的代码。我只希望以下API样式起作用。

1秒后的输出为AA 3 4 5 6 2秒后的输出变为3 4 5 6

import { render } from "solid-js/web";
import { For, createSignal, createMemo, mapArray } from "solid-js";


function make_position(_: number) {

  let [removing, setRemoving] = createSignal()

  return {
     get value() {
        return removing() ? 'a': _
     },
     async on_remove() {
        // I want `mapArray` to call this function when an item is removed, and wait on the returned promise to actually remove the item.
        setRemoving(true)
        return new Promise(resolve => {
           setTimeout(resolve, 1000);
        })
     }
  }
}

function Counter() {
  const [list1, setList1] = createSignal([1, 2, 3, 4, 5]);

  const ls = createMemo(mapArray(list1, _ => make_position(_)))

  setTimeout(() => {
    setList1([3,4,5,6])
  }, 1000)
  
  return (<>
    <For each={ls()}>{ item => 
       <span>{item.value}</span>
    }</For>
    </>)
}

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

I don't want to use transition-group or any superfluous code. I just want the below API style to work.

The output after 1 second is a a 3 4 5 6
The output after 2 second becomes 3 4 5 6

import { render } from "solid-js/web";
import { For, createSignal, createMemo, mapArray } from "solid-js";


function make_position(_: number) {

  let [removing, setRemoving] = createSignal()

  return {
     get value() {
        return removing() ? 'a': _
     },
     async on_remove() {
        // I want `mapArray` to call this function when an item is removed, and wait on the returned promise to actually remove the item.
        setRemoving(true)
        return new Promise(resolve => {
           setTimeout(resolve, 1000);
        })
     }
  }
}

function Counter() {
  const [list1, setList1] = createSignal([1, 2, 3, 4, 5]);

  const ls = createMemo(mapArray(list1, _ => make_position(_)))

  setTimeout(() => {
    setList1([3,4,5,6])
  }, 1000)
  
  return (<>
    <For each={ls()}>{ item => 
       <span>{item.value}</span>
    }</For>
    </>)
}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

丿*梦醉红颜 2025-02-09 18:34:23

跟踪信号的价值足以实现所需的目标。 已经使用maparraycreateMeMo内部,因此const ls = createMemo(maparray(list1,_ =&gt; make_position)(_ )))是不必要的。

function Counter() {
  const [list1, setList1] = createSignal([1, 2, 3, 4, 5]);

  setTimeout(() => {
    setList1([3, 4, 5, 6])
  }, 1000)

  return (<>
    <For each={list1()}>
      {item =>
        <span>{item}</span>
      }</For>
  </>)
}

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

您可以使用承诺来设置新值。如果您要通过网络请求接收新值,请使用资源。


type QueryParams = number;

const fetchData = (params: QueryParams) => new Promise<Array<number>>((resolve, reject) => {
  if (params === 0) {
    resolve([1, 2, 3, 4, 5]);
  }

  if (params === 1) {
    resolve([3, 4, 5]);
  }
});

function Counter() {
  const [params, setParams] = createSignal(0);
  const [data, { mutate, refetch }] = createResource(params, fetchData);

  setTimeout(() => {
    setParams(p => p + 1);
  }, 1000)

  return (
    <Show when={!data.loading} fallback={<div>Loading</div>}>
      <For each={data()}>
        {item =>
          <span>{item}</span>
        }
      </For>
    </Show>)
}

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

Tracking the signal's value is enough to achieve what you want. For already uses both mapArray and createMemo internally, so const ls = createMemo(mapArray(list1, _ => make_position(_))) is unnecessary.

function Counter() {
  const [list1, setList1] = createSignal([1, 2, 3, 4, 5]);

  setTimeout(() => {
    setList1([3, 4, 5, 6])
  }, 1000)

  return (<>
    <For each={list1()}>
      {item =>
        <span>{item}</span>
      }</For>
  </>)
}

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

You can use a promise to set the new value. If you are going to receive the new value through network request, use a resource.


type QueryParams = number;

const fetchData = (params: QueryParams) => new Promise<Array<number>>((resolve, reject) => {
  if (params === 0) {
    resolve([1, 2, 3, 4, 5]);
  }

  if (params === 1) {
    resolve([3, 4, 5]);
  }
});

function Counter() {
  const [params, setParams] = createSignal(0);
  const [data, { mutate, refetch }] = createResource(params, fetchData);

  setTimeout(() => {
    setParams(p => p + 1);
  }, 1000)

  return (
    <Show when={!data.loading} fallback={<div>Loading</div>}>
      <For each={data()}>
        {item =>
          <span>{item}</span>
        }
      </For>
    </Show>)
}

render(() => <Counter />, document.getElementById("app"));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文