Size: a a a

2020 August 13

IS

Ivan Sherstnuyk in ☄️ effector
это понятно, этим я и планирую заниматься в выхи)
но меня волнует вопрос другой, если тут так получилось, то есть вероятность что в других местах может возникнуть что то подобное, то как это отлавливать
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
🚀🔬 🚀🔬🚀🔬
сейчас тесты jest проходят если ничего не поменялось, если проблема будет исправлена, то тест упадёт
чтобы не запускать ресурсоёмкие тесты типов, можно включать тесты как yarn test --testPathPattern='vue/__tests__' --watch
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
Ivan Sherstnuyk
это понятно, этим я и планирую заниматься в выхи)
но меня волнует вопрос другой, если тут так получилось, то есть вероятность что в других местах может возникнуть что то подобное, то как это отлавливать
если повезёт, то в имплементации будет явная проблема, а грейзенбаг её маскирует каким-нибудь setImmediate, тогда достаточно будет исправить исходный код
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
если не повезёт, то проблема будет создаваться на уровне бандлера (куда девается огромный vue-модуль при umd/cjs?), тогда будем думать)
источник

ф

фильтруй мысли... in ☄️ effector
🚀🔬 🚀🔬🚀🔬
если юзать effector-vue то в бандл попадает модуль vue/dist/vue.runtime.common.dev.js, если юзать umd, то его просто нет
может терсер?
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
дев бандл razzle работает без минификации
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
а у umd/mjs бандлов effector-vue особой разницы нет
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
я их напрямую сравниваю, прогнав через онлайн-prettier
источник

Б

Богдан in ☄️ effector
Народ, а есть ли в эффекторе возможность не вызывать каждый раз useStore а сразу получать значения в шаблонах?
Используя useStore приходится писать так
const App = () => {
 const value1 = useStore(store1);
 const value2 = useStore(store2);
 const value3 = useStore(store3);
 const value4 = useStore(store4);
 const value5 = useStore(store5);

 return (
   <div>
     <div>{value1}</div>
     <div>{value2}</div>
     <div>{value3}</div>
     <div>{value4}</div>
     <div>{value5}</div>
   </div>
 )
}
а я хочу писать как-то так (читать переменные сразу в шаблоне например вызывая через функцию без необходимости дублировать эти переменные через useStore)
const App = () => {
 return (
   <div>
     <div>{value1()}</div>
     <div>{value2()}</div>
     <div>{value3()}</div>
     <div>{value4()}</div>
     <div>{value5()}</div>
   </div>
 )
}
И можно было бы написать простой враппер const value1 = () => useStore(store1) - но проблема в том реакт выдаст ошибку (или будут баги) если вызывать useStore внутри условий - <div>{someFlag ? value1() : value2()}</div>
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
Богдан
Народ, а есть ли в эффекторе возможность не вызывать каждый раз useStore а сразу получать значения в шаблонах?
Используя useStore приходится писать так
const App = () => {
 const value1 = useStore(store1);
 const value2 = useStore(store2);
 const value3 = useStore(store3);
 const value4 = useStore(store4);
 const value5 = useStore(store5);

 return (
   <div>
     <div>{value1}</div>
     <div>{value2}</div>
     <div>{value3}</div>
     <div>{value4}</div>
     <div>{value5}</div>
   </div>
 )
}
а я хочу писать как-то так (читать переменные сразу в шаблоне например вызывая через функцию без необходимости дублировать эти переменные через useStore)
const App = () => {
 return (
   <div>
     <div>{value1()}</div>
     <div>{value2()}</div>
     <div>{value3()}</div>
     <div>{value4()}</div>
     <div>{value5()}</div>
   </div>
 )
}
И можно было бы написать простой враппер const value1 = () => useStore(store1) - но проблема в том реакт выдаст ошибку (или будут баги) если вызывать useStore внутри условий - <div>{someFlag ? value1() : value2()}</div>
я пишу useStore инлайн, просто тогда сразу определяю, что этот компонент без условий и циклов, как у тебя во втором случае

const App = () => (
 <div>
   <div>{useStore(value1)}</div>
   <div>{useStore(value2)}</div>
   <div>{useStore(value3)}</div>
 </div>
)
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
а если в компоненте есть условия, то правила хуков в любом случае обязывают тебя вынести вызов в начало компонента, то есть это даже не то, что мы могли бы выбирать
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
единственное что — можно визуально сократить занимаемое место если скомбайнить все необходимые компоненту сторы и вызывать useStore один раз
источник

Б

Богдан in ☄️ effector
У меня есть идея - можно создать некий враппер над компонентом и над стором
и он будет автоматически подписывать компонент на все сторы которые вызываются внутри - value1(), value2(), value3() и т.д. Тут уже условия не страшны так как будет подписка только на те сторы которые срабатывают в нужном бранче условия - <div>{someFlag ? value1() : value2()}</div>
const store1 = createStore(..)
const store2 = createStore(..)
const store3 = createStore(..)
const store4 = createStore(..)
const store5 = createStore(..)

const value1 = autoSub(store1);
const value2 = autoSub(store2);
const value3 = autoSub(store3);
const value4 = autoSub(store4);
const value5 = autoSub(store5);

const App = component(() => {
 return (
   <div>
     <div>{value1()}</div>
     {someFlag
       ? <div>{value2()}</div>
       : <div>{value3()}</div>
     }
     <div>{value4()}</div>
     <div>{value5()}</div>
   </div>
 )
})
источник

Б

Богдан in ☄️ effector
Вот примерная реализация
let CurrentComponentStores = null;
const component = () => {
 return (fn) => {
   //получаем из состояния все сторы на которые компонент подписан
   const storesState = useRef({stores: [], storesUnsubs: []});
   
   //и отписываемся (если это медленно то можно добавить сравнение старых сторов и новых чтобы отписываться только от нужных)
   storesState.storesUnsubs.forEach(unsub => unsub());
   
   //вытаскиваем setState чтобы обновить компонент при изменении стора
   const [state, setState] = useState({});

   //записываем в глобальную переменную сторы чтобы вызов autoSub смог запушить себя но сначала свапим с временной переменной чтобы восстановить после вызова компонента
   const temp = CurrentComponentStores;
   CurrentComponentStores = storesState.stores = [];
   
   //вызываем компонент
   fn();
   
   //восстанавливаем предыдущее значение CurrentComponentStores
   CurrentComponentStores = temp;
   
   //подписываемся на все сторы которые были автоматически добавлены
   storesState.storesUnsubs = storesState.stores.map(store => store.updates.watch(() => setState({})))
 }
}
const autoSub = (store) => {
 return () => {
    //пушим в глобальную переменную чтобы враппер component смог подписаться на стор
    if(CurrentComponentStores) CurrentComponentStores.stores.push(store);
    return store.getState();
 }
}
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
Богдан
Вот примерная реализация
let CurrentComponentStores = null;
const component = () => {
 return (fn) => {
   //получаем из состояния все сторы на которые компонент подписан
   const storesState = useRef({stores: [], storesUnsubs: []});
   
   //и отписываемся (если это медленно то можно добавить сравнение старых сторов и новых чтобы отписываться только от нужных)
   storesState.storesUnsubs.forEach(unsub => unsub());
   
   //вытаскиваем setState чтобы обновить компонент при изменении стора
   const [state, setState] = useState({});

   //записываем в глобальную переменную сторы чтобы вызов autoSub смог запушить себя но сначала свапим с временной переменной чтобы восстановить после вызова компонента
   const temp = CurrentComponentStores;
   CurrentComponentStores = storesState.stores = [];
   
   //вызываем компонент
   fn();
   
   //восстанавливаем предыдущее значение CurrentComponentStores
   CurrentComponentStores = temp;
   
   //подписываемся на все сторы которые были автоматически добавлены
   storesState.storesUnsubs = storesState.stores.map(store => store.updates.watch(() => setState({})))
 }
}
const autoSub = (store) => {
 return () => {
    //пушим в глобальную переменную чтобы враппер component смог подписаться на стор
    if(CurrentComponentStores) CurrentComponentStores.stores.push(store);
    return store.getState();
 }
}
мощно) это практически половина реализации useStore плюс заметная часть самой идеи хука как концепции
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
сейчас в реакт-сообществе оборачивание функций-компонентов в обёртки в целом теряет популярность, поэтому effector-react таких функций практически не содержит, но тебе использовать такой подход ничто не мешает)
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
Богдан
Вот примерная реализация
let CurrentComponentStores = null;
const component = () => {
 return (fn) => {
   //получаем из состояния все сторы на которые компонент подписан
   const storesState = useRef({stores: [], storesUnsubs: []});
   
   //и отписываемся (если это медленно то можно добавить сравнение старых сторов и новых чтобы отписываться только от нужных)
   storesState.storesUnsubs.forEach(unsub => unsub());
   
   //вытаскиваем setState чтобы обновить компонент при изменении стора
   const [state, setState] = useState({});

   //записываем в глобальную переменную сторы чтобы вызов autoSub смог запушить себя но сначала свапим с временной переменной чтобы восстановить после вызова компонента
   const temp = CurrentComponentStores;
   CurrentComponentStores = storesState.stores = [];
   
   //вызываем компонент
   fn();
   
   //восстанавливаем предыдущее значение CurrentComponentStores
   CurrentComponentStores = temp;
   
   //подписываемся на все сторы которые были автоматически добавлены
   storesState.storesUnsubs = storesState.stores.map(store => store.updates.watch(() => setState({})))
 }
}
const autoSub = (store) => {
 return () => {
    //пушим в глобальную переменную чтобы враппер component смог подписаться на стор
    if(CurrentComponentStores) CurrentComponentStores.stores.push(store);
    return store.getState();
 }
}
а хотя не, нельзя, ты же не знаешь, все ли ты собрал ветки из функции, а вдруг там есть неучтенные сторы?
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
когда неучтенные сторы впервые появятся, реакт выдаст предупреждение
источник

Б

Богдан in ☄️ effector
🚀🔬 🚀🔬🚀🔬
а хотя не, нельзя, ты же не знаешь, все ли ты собрал ветки из функции, а вдруг там есть неучтенные сторы?
Что за неучтенные сторы?
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
Богдан
Народ, а есть ли в эффекторе возможность не вызывать каждый раз useStore а сразу получать значения в шаблонах?
Используя useStore приходится писать так
const App = () => {
 const value1 = useStore(store1);
 const value2 = useStore(store2);
 const value3 = useStore(store3);
 const value4 = useStore(store4);
 const value5 = useStore(store5);

 return (
   <div>
     <div>{value1}</div>
     <div>{value2}</div>
     <div>{value3}</div>
     <div>{value4}</div>
     <div>{value5}</div>
   </div>
 )
}
а я хочу писать как-то так (читать переменные сразу в шаблоне например вызывая через функцию без необходимости дублировать эти переменные через useStore)
const App = () => {
 return (
   <div>
     <div>{value1()}</div>
     <div>{value2()}</div>
     <div>{value3()}</div>
     <div>{value4()}</div>
     <div>{value5()}</div>
   </div>
 )
}
И можно было бы написать простой враппер const value1 = () => useStore(store1) - но проблема в том реакт выдаст ошибку (или будут баги) если вызывать useStore внутри условий - <div>{someFlag ? value1() : value2()}</div>
кстати, я только сейчас вспомнил, если тебя беспокоит большое количество вызовов useStore , то можно заюзать createComponent

const App = createComponent({foo, bar}, (props, {foo, bar}) => {

})
источник