Вложенный createEffect не перезапускается

Я не уверен, правильно ли я воспроизвел свою проблему, но вот она:

При сигнале рендеринга у меня есть какое-то создание объекта, которое приводит к большему количеству эффектов создания, которые зависят от сигнала обновления. Но каким-то образом область действия удаляется, и она срабатывает только один раз во время создания. Несмотря на то, что у меня есть ссылки на эти объекты, как я могу убедиться, что вложенный createEffect продолжает срабатывать?

import { render } from 'solid-js/web';
import { on, createSignal, createEffect } from 'solid-js'

function HelloWorld() {

  let [render, setRender] = createSignal(undefined, { equals: false })

  let [update, setUpdate] = createSignal(undefined, { equals: false })
let i = 0

  createEffect(on(render, () => {
    if (i++ === 1) {
      createEffect(on(update, () => {
        console.log('inside')
      }))
    }
  }))

  createEffect(on(update, () => {
    console.log('regular', i)
  }))

 setInterval(() => {
   setUpdate();
    setRender();
  })
  return <div>Hello World!</div>;
}

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

Я хочу regular и inside журналы на каждом интервале.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
2
0
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать createRoot, чтобы перезаписать корень вложенного createEffect. В противном случае он будет удаляться при каждом повторном запуске «родительского» эффекта.

createEffect(() => {
   createRoot(dispose => {
      // effect will be disposed only when
      // the dispose() fn get's called
      createEffect(() => {...})
   })
})

https://playground.solidjs.com/?hash=-999371052&version=1.3.13

как бы я узнал или отладил эту проблему и каковы последствия этого решения. Почему solid-js представляет собой беспорядок усложнения спагетти-кода. Кстати, я переписал solid-js для библиотеки рендеринга 2d webgl, которую использую, поэтому у меня есть некоторое представление о внутренностях.

eguneys 22.04.2022 22:05

Пожалуйста, уточните свой ответ, как это работает и что контролирует удаление областей. Например, почему компоненты не удаляются или каков корень по умолчанию для createEffect, почему он влияет только на вложенные вещи.

eguneys 22.04.2022 22:08

Насколько я знаю, только две вещи могут распоряжаться вычислениями: корни и другие вычисления. С корнями у вас есть явный контроль над этим, с вычислениями, которые происходят до повторного запуска. Я считаю, что владельцем эффекта верхнего уровня в вашем примере является функция рендеринга, которая выполняется один раз и никогда не удаляется. Таким образом, ваш эффект верхнего уровня следует тем же правилам, что и вложенный, просто владельца, которому он принадлежит, никогда не нужно удалять. Для вложенного это происходит всякий раз, когда изменяется сигнал. Это может показаться сложным, но все последовательно следует этим правилам.

thetarnav 22.04.2022 22:19

Другие вопросы по теме

Передача vscode во внешние функции
Firebase: Почему мой код использует только первый документ в моей коллекции?
Реагировать на ошибку машинописного текста - элемент неявно имеет любой тип, потому что выражение строки типа не может использоваться для индексирования типа {}
Как получить доступ к вложенным необязательным индексам из интерфейса
Почему машинописный текст не может контекстуально вывести эти типы промежуточного программного обеспечения
Передать конструктор класса как функцию в другом классе
React & clsx: добавьте имя класса, если текущий элемент в сопоставленном массиве является первым из нескольких элементов
Свойство «MathFun» отсутствует в типе «(x?: число, y?: число) => число», но требуется в типе «Func».
Получение строки типа не может быть назначено строке типа для компонента TS в сборнике рассказов
Как ввести useState для файлов?