Может ли стройный использовать составные функции?

#javascript #svelte #sveltekit

Вопрос:

Я родом из vue и привык к составным функциям. Я пытаюсь понять, как это сделать в стройной

Поэтому я создал файл js и импортировал хранилище, а затем попытался создать функцию, которую я мог бы вызывать для нескольких компонентов и действовать индивидуально

swipe.js файл

 import { writable, derived, get } from 'svelte/store';

function createSwipe() {

  const dyFromStart = writable(0)

  function moveEvent(eventType, val){
    console.log('moveEvent', eventType, val, get(dyFromStart))
    dyFromStart.update(n => n   1);
  }

  const dxScore = derived(dyFromStart, $dyFromStart => $dyFromStart   3)
  const dyScore = derived(dyFromStart, $dyFromStart => Math.round($dyFromStart   100));
  return {
    moveEvent,
    dxScore,
    dyScore, 
  };
}

export const swipe = createSwipe();

 

затем в .стройный компонент импортируйте функцию в скрипт и разложите на подразделы

 <script>
import { swipe } from "$lib/swipe";
let { moveEvent, dxScore, dyScore } = swipe
</script>
<p>{$dxScore}{$dyScore}</p>
<button on:click="() => moveEvent">button</button>
 

Ну, в конце концов, я хочу превратиться в компонент салфетки, отсюда и название, но пытаюсь разобраться в основах. Поэтому я хочу иметь возможность иметь уникальное хранилище для каждого компонента, и для этого, если я использую несколько компонентов this .svelte, состояние будет общим для всех.

И не просто как три компонента idk modal.svelte, я хочу использовать свайп для множества различных компонентов, возможно, для просмотра фотографий.svelte просто универсальная функция свайпа и использовать один и тот же код для всех.

или мне просто нужно будет сохранить состояние, например const dyFromStart = writable(0) , только let dyFromStart = 0 в каждом компоненте .svelte, и передать его в чистую функцию js, которая возвращает результаты и обновляет локальные переменные .svelte

Добавив это в качестве не магазинных более чистых вещей js, которые я пытался, но не смог отреагировать, поэтому принятие приведенного ниже ответа о методе магазина, который работал и звучит как правильный подход

 export function createSwipe() {
 let dyFromStart = 0

  function moveEvent(eventType, val){
    console.log('moveEvent', eventType, val, dyFromStart, dxScore(), dyScore())
    dyFromStart  
  }

  function dxScore(){ return dyFromStart   3 }
  // const dzScore = derived(dyFromStart, $dyFromStart => $dyFromStart   3)
  const dyScore = () => Math.round(dyFromStart   100)
  
  return {
    moveEvent,
    dxScore,
    dyScore,
    dyFromStart
  };
 
 export function createSwipe() {
let dyFromStart = 0
  let dxScore = dyFromStart   3
  let dyScore = Math.round(dyFromStart   100)

  function moveEvent(eventType, val){
    console.log('moveEvent', eventType, val, dyFromStart, dxScore, dyScore)
    dyFromStart  
    dxScore = dyFromStart   3
    dyScore = Math.round(dyFromStart   100)
  }

  return {
    moveEvent,
    dxScore,
    dyScore,
    dyFromStart
  };
 

Я полагаю, что это прекрасно работает, просто не реагирует на$, и если вы это делаете, вам нужно позвонить, чтобы обновить локальный var diff

мне это показалось бы наиболее стройным или чем-то в этом роде, что касается составного типа функции, а не типа хранилища

 export function createSwipe() {
 let dyFromStart = 0

  function moveEvent(eventType, val){
    console.log('moveEvent', eventType, val)
    dyFromStart  
  }

  $: dxScore = dyFromStart   3
  $: dyScore = Math.round($dyFromStart   100)
  return {
    moveEvent,
    dxScore,
    dyScore, 
  };
}
 

Ответ №1:

Я не до конца понимаю вопрос, поэтому сначала пытаюсь повторить то, что, по-моему, вы хотите:

  • Вы хотите использовать функцию свайпа в нескольких местах
  • Каждое использование этой функции салфетки должно быть независимым от всех остальных

Если это правильно, то ответ прост: не делай export const swipe = createSwipe() этого . Удалите эту часть и вместо этого экспортируйте функцию создания для использования непосредственно в ваших компонентах. Таким образом, вы каждый раз создаете новый независимый экземпляр:

 <script>
  import { createSwipe } from "$lib/swipe";
  let { moveEvent, dxScore, dyScore } = createSwipe()
</script>
<p>{$dxScore}{$dyScore}</p>
<button on:click="() => moveEvent">button</button>
 

Комментарии:

1. Отлично, да, это именно то, что я хотел, спасибо! Следующий вопрос заключается в том, должен ли код (или рекомендуется) использовать переменные типа хранилища или он будет работать с обычным js. Когда я попробовал использовать обычный js, я не совсем понял, как сделать так, чтобы vars был реактивным, и попытался использовать $: locDxScore = dxScore или как var dxScore() и не был бы реактивным. Если бы вызывалась кнопка и журнал консоли, он вызвал бы ее и показал правильный результат, но я бы предпочел, чтобы это было просто автоматически, если это возможно. Я не на 100% уверен во всех плюсах и минусах магазина, так как новичок в стройности, так что да, здесь лучше или хуже

2. Использование магазина является правильным выбором в этом случае для того, чтобы получить желаемую реактивность, автоматические обновления и т.д.

3. Я добавил некоторые из вещей, которые я пробовал не в магазине, которые не были реактивными (или я делал не совсем правильно), но хорошо, похоже, что магазин-это путь в любом случае, спасибо. Является ли это в целом верным и в качестве наилучшего подхода? Как и переменная let .стройный <скрипт> является реактивным, но не может переместить этот точный код (без хранилища) извне, ввести и работать так же реактивно и все такое

4. Потому что, если у меня действительно длинный js-код, я имею в виду, что не идеально иметь сверхдлинный js-код в одном файле, но также не идеально, чтобы все нужно было конвертировать в хранилище для перемещения во внешний файл, верно? Похоже, должно работать так же, как и с внешним файлом, я просто должен сделать это правильно, но, возможно, я ошибаюсь