Dans votre question swap!
c'est prendre un atome, une fonction ( assoc
) qui met à jour la valeur que l'atome stocke y les arguments ultérieurs qui sont donnés à la fonction.
Voici une autre façon d'obtenir le même résultat :
#(swap! fields (fn [prev] (assoc prev :name (-> % .-target .-value)))
Voir que :name
y (-> % .-target .-value)
seraient les deux arguments suivants dans le swap!
l'invocation de votre question, où apply
est utilisé en interne pour appliquer ces arguments à assoc
. Ici, il n'y a qu'une fonction de mise à jour - aucun argument ultérieur.
Comme vous pouvez le constater prev
est la valeur interne de l'atome que nous allons modifier et swap!
prend simplement une fonction de mise à jour, qui renvoie la valeur suivante pour la fonction swap!
à stocker.
En ce qui concerne (-> % .-target .-value)
va, rappelez-vous que vous êtes déjà dans la macro du lecteur, donc %
est son premier argument. Le site ->
La macro de filetage est intégrée au premier argument de chaque fonction suivante, de sorte que %
est donné à .-target
et le résultat de cette opération est donné à .-value
en nous donnant : (.-value (.-target %))
.
:name
dans la carte stockée dans les champs est définie comme la valeur cible d'une valeur fournie !
Sortir un peu plus large %
est un événement JavaScript qui est fourni chaque fois que le champ de saisie de texte est modifié - en fait, chaque fois que l'utilisateur tape du texte. Il est rare que vous souhaitiez obtenir l'intégralité de l'événement, mais seulement le texte qui a été saisi. C'est là qu'intervient la récupération de la cible de l'événement (par opposition à la source), puis de la valeur de cette cible. Le site .-
signifie que vous obtenez une propriété JavaScript - c'est de l'interopérabilité, par opposition à la syntaxe ClojureScript normale.