#javascript #node.js #svelte
#javascript #node.js #стройный
Вопрос:
Я пытаюсь поместить функцию между блоками if else. ниже то, что я себе представляю, это было бы.:
<script>
let condition=false
function function_here(event){
if(event){
condition = true;
}else if(!event){
condition = false;
}else{
condition = !condition;
}
</script>
{#each post as posts}
{#if posts.object1==="match" }
<p>HTML HERE</p>
{function_here(true)}
{/if}
{/each}
{#if condition}
<button>type1</button>
{:else}
<button>type2</button>
{/if}
если только во время цикла post результат, если найденные posts.object1 совпадают, мне нужно изменить статус переменной «условие»
однако этот пример возвращает результат «undefined».
Как мне поместить функцию между блоками if в svelte?
Комментарии:
1. Можете ли вы привести лучший пример? Вы переходите
true
к нему, поэтому он всегда будет работатьcondition = true
. Я не вижу цели этого. И вы, вероятно, видите,undefined
потому что функция ничего неreturn
делает.2. Может быть, вы действительно хотите заранее вычислить значение с
condition = posts.some(post => post.object1 === 'match')
3. это одна из первых вещей, которые вы должны знать о javascript. если функция ничего не возвращает, она вернет
undefined
. ваша функция ничего не возвращает4. привет, Феликс. мне нужно возвращать условие обратно в false после каждого цикла post. мне нужно использовать функцию toggle like в какой-то другой части кода, но в этой части мне нужно иметь возможность передавать true, когда post.object1 совпадает. вот почему функция выглядит так.
Ответ №1:
Подобный вызов функций внутри шаблона считается плохой практикой в Svelte, этот код принадлежит скриптовой части компонента. Лучший подход к этой проблеме — реактивная переменная, чтобы она также изменялась, если posts
изменяется:
$: condition = posts.... // something based on posts
Какое условие на самом деле выполняется, зависит от вас, хотя код, который вы указали в своем ответе, кажется очень упрощенным по сравнению с фактическим кодом.
Комментарии:
1. ты предлагаешь делать петли в <script> , pass a posts data into condition first, before do another loop in template? Если нет, то запустить эту строку в шаблон или <script>? если в шаблоне, я думаю, это будет так же, как если бы я пытался поместить функцию в шаблон. но если делать в скрипте, ну, это ничем не отличается от использования обычного js. пожалуйста, поправьте меня, если я ошибаюсь.
Ответ №2:
Вы пытаетесь подойти к этому так, как хотелось бы JSX. Почему бы не абстрагировать эту логику в простой JS внутри <script>
?
<script>
let condition = false
function function_here(event) {
if (event) {
condition = true;
} else if (!event) {
condition = false;
} else {
condition = !condition;
}
}
for (post in posts) {
if (post.object1 === 'match') {
function_here(true)
}
}
</script>
{#each post as posts}
{#if post.object1 === "match" }
<p>HTML HERE</p>
{/if}
{/each}
{#if condition}
<button>type1</button>
{:else}
<button>type2</button>
{/if}
Комментарии:
1. я не думаю, что это может сработать. функция не может запускаться за пределами одного и того же блока цикла, потому что условие будет запускаться несколько раз в реальном коде. для каждого сообщения мне нужно преобразовать условие обратно в false, чтобы я мог правильно использовать функцию переключения (которая является «условием») для правильной работы.
Ответ №3:
Я понимаю, что в других ответах предлагается использовать лучшие практики. Однако, чтобы ответить на общий вопрос о запуске или вызове JS-кода в Svelte в его HTML-частях, можно выполнить следующее.
<script>
...
</script>
<!-- HTML part -->
{functionCall() || ""} <-- This avoids 'undefined' showing up in your markup!
Или альтернативно,
<!-- HTML part -->
{"" ?? functionCall()} <-- This avoids 'undefined' showing up in your markup!
Ответ №4:
А еще лучше, используйте оператор void. Использование void и оператора Nullish гарантирует, что, даже если ваша функция возвращает значение, в вашей разметке ничего не отображается.
<!-- HTML part -->
{void functionCall() ?? ""} <-- This avoids any sort of value from showing up in your markup!