Dies ist ein funktionierendes Beispiel mit einem Problem. Ich möchte ein vorhandenes Array in ein Signal spleißen und es zurückgeben, um es aktualisiert zu sehen. Aber es funktioniert nicht. Wie mutiere ich einfach das Array innerhalb eines Signals? Ich möchte keine neuen Arrays erstellen, sondern nur einen einfachen Spleiß. In den Dokumenten gibt es kein Beispiel zum Mutieren eines Arrays.
import { render } from 'solid-js/web';
import { createSignal, createEffect } from 'solid-js'
function HelloWorld() {
let [a, setA] = createSignal([])
setTimeout(() =>
setA(a => {
a.splice(0, 0, 'hello')
// this logs as requested if I uncomment this
//return ['hello']
return a
}))
createEffect(() => {
console.log(a())
})
return <div>Hello World!</div>;
}
render(() => <HelloWorld />, document.getElementById('app'))
Das Solid-Tutorial empfiehlt dringend die Unveränderlichkeit :
Solid empfiehlt dringend die Verwendung flacher, unveränderlicher Muster zum Aktualisieren des Zustands. Durch die Trennung von Lese- und Schreibvorgängen behalten wir eine bessere Kontrolle über die Reaktivität unseres Systems, ohne Gefahr zu laufen, Änderungen an unserem Proxy aus den Augen zu verlieren, wenn sie durch Schichten von Komponenten geleitet werden.
Ein unveränderlicher Weg, um das zu erreichen, was Sie anstreben, könnte etwa so aussehen:
setA(a => ['hello', ...a])
Wenn Sie jedoch feststellen, dass Sie das Signal mutieren müssen , können Sie im createSignal
Optionsobjekt angeben, wie Solid feststellt, ob ein Signal aktualisiert wurde . Standardmäßig werden Signaländerungen durch referentielle Gleichheit mit dem ===
Operator verglichen. Sie können Solid anweisen , Abhängigkeiten immer erneut auszuführen, nachdem der Setter aufgerufen wurde, indem Sie Folgendes equals
festlegen false
:
let [a, setA] = createSignal([], { equals: false });
Oder Sie können eine Funktion übergeben, die die Werte und des Signals übernimmt und ein previous
zurückgibt :next
boolean
let [a, setA] = createSignal([], { equals: (prev, next) => {
if (/* dependents should run */) {
return false;
}
// dependents shouldn't run
return true;
} });
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen