通过SolidJS中的道具

发布于 2025-02-01 10:47:36 字数 3580 浏览 3 评论 0原文

我试图通过SolidJS进行道具时遇到了一些奇怪的事情。我使用stestore创建了一个商店,我使用context.provider通过该商店。我还具有助手函数usestore,它使我可以在组件树中的任何地方访问商店(我正在尝试使用SolidJ中的React Design模式)。我有两个组件anime.jsx(parent)和episodelist.jsx(child)。当动漫组件安装时,我将获取数据到episodelist。但是,访问episodeList的道具返回一个空代理(不确定为什么,但我认为episodeList component在商店使用store.currentanimedata上更新时不会重新渲染组件。 )。我已经在下面附加了下面的输出。

对此的任何帮助将不胜感激。

###################################
# Anime.jsx (Parent component)
###################################
const Anime = (props) => {
  const [store, setStore] = useStore();

  const getAnimeData = async () => {
    const currentAnimeId = store.currentAnime.animeId;
    const currentAnimeData = await firebase.getAnimeData(currentAnimeId);
    setStore(
      produce((store) => {
        store.currentAnimeData = currentAnimeData;
      })
    );
  };

  onMount(() => {
    getAnimeData();
  });

  return (
    <>
      <div
        className={css`
          width: 100%;
          min-height: 20px;
          margin: 8px 0px 5px 0px;
          padding: 0px 10px;
          box-sizing: border-box;
          font-size: 20px;
          word-wrap: break-word;
          line-height: 1;
        `}
      >
        <span
          className={css`
            font-size: 20px;
            color: #e32451;
          `}
        >
          {"Watching: "}
        </span>
        {store.currentAnime.name}
      </div>
      <Search></Search>
      <EpisodeList animeData={store.currentAnimeData.episodes} />
    </>
  );
};

#####################################
# EpisodeList.jsx (child component)
#####################################

const EpisodeList = (props) => {
  console.log(props);
  console.log(props.animeData);

  ...... # UI stuff

  return (
    <div
      className={css`
        width: 100%;
        height: 100%;
        box-sizing: border-box;
        display: flex;
        flex-direction: column;
        padding-bottom: 5px;
        margin-top: 10px;
      `}
    >
      <ScrollActionUp onmousedown={[scroll, true]} onmouseup={onmouseup}>
        ➭
      </ScrollActionUp>
      <div
        className={css`
          width: 100%;
          height: 432px;
          box-sizing: border-box;
          padding: 10px 10px 0px 10px;
          overflow: hidden;
        `}
        ref={scrollRef}
      >
        <For each={animeData.episodes}>
          {(episode, index) => {
            return (
              <Episode status={episode.watched} episode={episode}></Episode>
            );
          }}
        </For>
      </div>
      <ScrollActionDown onmousedown={[scroll, false]} onmouseup={onmouseup}>
        ➭
      </ScrollActionDown>
    </div>
  );
};

###############
# store.jsx
###############
import { createContext, createSignal, useContext } from "solid-js";
import { createStore } from "solid-js/store";

const StoreContext = createContext();

export function ContextProvider(props) {
  const [store, setStore] = createStore({});

  return (
    <StoreContext.Provider value={[store, setStore]}>
      {props.children}
    </StoreContext.Provider>
  );
}

export function useStore() {
  return useContext(StoreContext);
}

I came across something weird while trying to pass props in SolidJS. I've created a store using createStore which I pass through the component tree using Context.Provider. I also have the helper function useStore which lets me access the store anywhere in the component tree (I'm experimenting with React design patterns in SolidJS). I have two components Anime.jsx (parent) and EpisodeList.jsx (child). I'm fetching data when the Anime component mounts and then populate the store with the setter provided by createStore.After which I pass the fetched data to EpisodeList. However, accessing the props of EpisodeList returns an empty proxy (Not sure why, but I think the EpisodeList component isn't re-rendered when store is updated with store.currentAnimeData). I've attached the output below of the console.log statements below.

Any help regarding this would be highly appreciated.

###################################
# Anime.jsx (Parent component)
###################################
const Anime = (props) => {
  const [store, setStore] = useStore();

  const getAnimeData = async () => {
    const currentAnimeId = store.currentAnime.animeId;
    const currentAnimeData = await firebase.getAnimeData(currentAnimeId);
    setStore(
      produce((store) => {
        store.currentAnimeData = currentAnimeData;
      })
    );
  };

  onMount(() => {
    getAnimeData();
  });

  return (
    <>
      <div
        className={css`
          width: 100%;
          min-height: 20px;
          margin: 8px 0px 5px 0px;
          padding: 0px 10px;
          box-sizing: border-box;
          font-size: 20px;
          word-wrap: break-word;
          line-height: 1;
        `}
      >
        <span
          className={css`
            font-size: 20px;
            color: #e32451;
          `}
        >
          {"Watching: "}
        </span>
        {store.currentAnime.name}
      </div>
      <Search></Search>
      <EpisodeList animeData={store.currentAnimeData.episodes} />
    </>
  );
};

#####################################
# EpisodeList.jsx (child component)
#####################################

const EpisodeList = (props) => {
  console.log(props);
  console.log(props.animeData);

  ...... # UI stuff

  return (
    <div
      className={css`
        width: 100%;
        height: 100%;
        box-sizing: border-box;
        display: flex;
        flex-direction: column;
        padding-bottom: 5px;
        margin-top: 10px;
      `}
    >
      <ScrollActionUp onmousedown={[scroll, true]} onmouseup={onmouseup}>
        ➭
      </ScrollActionUp>
      <div
        className={css`
          width: 100%;
          height: 432px;
          box-sizing: border-box;
          padding: 10px 10px 0px 10px;
          overflow: hidden;
        `}
        ref={scrollRef}
      >
        <For each={animeData.episodes}>
          {(episode, index) => {
            return (
              <Episode status={episode.watched} episode={episode}></Episode>
            );
          }}
        </For>
      </div>
      <ScrollActionDown onmousedown={[scroll, false]} onmouseup={onmouseup}>
        ➭
      </ScrollActionDown>
    </div>
  );
};

###############
# store.jsx
###############
import { createContext, createSignal, useContext } from "solid-js";
import { createStore } from "solid-js/store";

const StoreContext = createContext();

export function ContextProvider(props) {
  const [store, setStore] = createStore({});

  return (
    <StoreContext.Provider value={[store, setStore]}>
      {props.children}
    </StoreContext.Provider>
  );
}

export function useStore() {
  return useContext(StoreContext);
}

Console output

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文