Phoenix LiveView est un framework puissant construit sur Elixir et offre une approche innovante pour créer des interfaces Web en temps réel sans avoir besoin de Javascript étendu.
Cependant, l'intégration avec des bibliothèques c?té client existantes, comme celles destinées au graphisme, à la visualisation ou au rendu, peut parfois s'avérer un défi.
Dans cet article, nous explorerons comment intégrer Phoenix LiveView aux bibliothèques Javascript qui s'affichent directement dans le DOM.
Nous rencontrerons des hooks, qui nous permettent d'exécuter du Javascript sur certains éléments du cycle de vie d'un élément donné, et comment ces hooks permettent de diffuser des événements (en utilisant push_event en LiveView et pushEvent en Javascript) pour permettre le bidirectionnel communication en temps réel entre le client et le serveur.
Arrière-plan
TLDR?: dans Phoenix LiveView, vous pouvez utiliser des hooks et push_event pour transmettre des données et laisser la bibliothèque c?té client gérer le rendu.
json-view (démo) - qui affiche les objets JSON sur une page Web sous forme d'arborescence pouvant être développée et réduite - est un bon exemple de la fa?on dont certaines bibliothèques Javascript c?té client prennent le contr?le du rendu dans le DOM et de l'interaction avec celui-ci. .
Travaillons sur un exemple de la fa?on d'intégrer cela avec les données JSON fournies par le serveur (LiveView). Nous enverrons des données statiques depuis le backend en réponse à un événement, mais ces données peuvent provenir de n'importe quelle source.
Ce qui suit suppose que vous avez configuré un projet Phoenix en utilisant mix phx.new, avec LiveView activé.
Configuration de la bibliothèque
Il existe plusieurs fa?ons d'incorporer un package Javascript dans le Javascript de la page.
Recommander une configuration préférée sort du cadre de cet article, mais il existe deux manières principales?:
- assets/vendor - dans le modèle de projet LiveView typique, la barre supérieure est placée dans ce répertoire et incluse dans le fichier de point d'entrée Assets/app/app.js. Cela convient aux bibliothèques plus petites et plus stables en général, en particulier si une version à fichier unique de la bibliothèque est fournie.
- NPM/Yarn - esbuild et webpack peuvent regrouper le fichier node_modules référencé dans un seul fichier de distribution. Cela convient aux bibliothèques plus grandes et plus complexes qui changent plus fréquemment.
Le problème avec json-view
Il existe deux modèles de rendu incompatibles lorsque l'on essaie de combiner les deux bibliothèques.
LiveView suit le modèle déclaratif?: vous concevez la vue, déterminez quelles données doivent être affichées et LiveView détermine quels éléments de la page doivent être modifiés lorsque les données sous-jacentes sont modifiées.
Il y parvient en utilisant les attributions de socket dans le rendu?:
def render(assigns) do ~H""" <p>Hello <%= @name %></p> """ end
Cependant, les bibliothèques comme json-view fonctionnent sur le modèle impératif. Nous précisons les étapes nécessaires pour afficher les données en Javascript, en dehors de la mise en page du DOM lui-même?:
import jsonview from '@pgrabovets/json-view'; const data = '{"name": "json-view", "version": "1.0.0"}' const tree = jsonview.create(data); jsonview.render(tree, document.querySelector('.tree'));
Ces deux modèles sont aux antipodes. Nous n'avons apparemment aucun moyen de faire correspondre les deux méthodes de rendu des données (déclaratif et impératif), mais nous avons besoin de bibliothèques comme json-view pour restituer des interfaces riches sur le client.
Fondamentalement, nous devons exécuter du code Javascript lorsque le serveur demande un changement d'état de la page. Jetons un coup d'?il aux hooks, qui permettent de réconcilier ces deux modèles de rendu.
Configuration du crochet
Dans LiveView, les hooks sont le moyen d'assurer une communication bidirectionnelle entre le client (navigateur) et le serveur (LiveView), l'objet principal de la communication étant l'événement.
Les hooks sont définis dans le LiveSocket et attachés à un élément à l'aide de l'attribut phx-hook. Il existe un certain nombre de rappels, mais nous nous concentrerons sur le rappel monté, puisque nous pouvons coordonner tout le reste via des événements. Vous pouvez également fournir des rappels pour d'autres événements du cycle de vie - consultez la documentation.
Dans un rappel comme monté, le hook envoie des événements au backend à l'aide de this.pushEvent et gère les événements du serveur en enregistrant un gestionnaire pour un nom d'événement particulier à l'aide de this.handleEvent.
Il est important de noter qu'un seul hook est autorisé par élément, vous n'avez donc besoin de raisonner que sur un seul flux d'événements entre le client et le serveur.
Avec ces connaissances à l'esprit, définissons un hook JsonView qui enregistre un gestionnaire d'événements, qui appelle finalement jsonview.render sur l'élément pour restituer l'arborescence des données.
import { Socket } from 'phoenix'; import jsonview from '@pgrabovets/json-view'; const JsonViewHook = { mounted() { this.handleEvent("render_json", ({ data }) => { this.el.innerHTML = ""; const tree = jsonview.create(data); jsonview.render(tree, this.el); }); } } const liveSocket = new LiveSocket( "/live", Socket, {hooks: { JsonView: JsonViewHook }, ...} ); ...
Nous faisons plusieurs choses dans ces plusieurs lignes de code?:
- Nous définissons un objet JsonViewHook avec une fonction montée. Cette fonction sera appelée lorsque l'élément avec ce hook sera monté dans le DOM.
- à l'intérieur de monté, nous avons mis en place un écouteur d'événement pour un événement personnalisé appelé "render_json". Cet événement sera déclenché depuis notre LiveView.
- Lorsque l'événement est re?u, il attend qu'un paramètre data contenant le JSON soit rendu.
- Nous effa?ons le contenu existant de l'élément.
- Nous utilisons jsonview.create et jsonview.render pour restituer les données JSON dans notre élément.
Pour utiliser ce hook - il suffit d'ajouter l'attribut phx-hook avec le nom du hook ("JsonView") à un élément?:
<div> <h2> Sending events to the server </h2> <p>We’ll just need to trigger an event from the backend to provide this data. We’ll leave this outside the scope of this article for now - perhaps a button could trigger an event to the backend? - but you could use this.pushEvent from the mounted hook like so:<br> </p> <pre class="brush:php;toolbar:false">mounted() { this.pushEvent("send_json", {}); }
pour envoyer un événement au serveur LiveView qui peut être géré avec handle_info. La section pertinente de la documentation LiveView couvre plus de possibilités avec this.pushEvent, y compris un scénario dans lequel une fonction de gestionnaire peut être spécifiée pour gérer directement une charge utile de réponse.
Envoi d'événements depuis le serveur
push_event/3 est le moyen de transmettre un événement de LiveView au navigateur. Il peut être appelé à tout moment - y compris lors du montage - bien qu'une bonne pratique consiste à s'assurer que la page et tous ses éléments sont dans un état connu avant d'envoyer ces événements. Sinon, des événements seront supprimés silencieusement lors de la configuration de la page - une voie s?re vers l'imprévisibilité?!
écrivons une clause handle_event pour un événement que nous pourrions recevoir du client, qui transmet un événement au client?:
def render(assigns) do ~H""" <p>Hello <%= @name %></p> """ end
C'est ?a ! Et il y a de la flexibilité ici aussi. L'enregistrement des gestionnaires d'événements avec des noms à la fois sur le client et sur le serveur marque une séparation claire entre la gestion de l'événement et la fa?on dont l'événement est déclenché.
Poursuite de l'intégration
Nous avons vu un exemple simple d’intégration entre client et serveur. Une extension courante de cela consisterait à étendre certaines mises à jour à certains éléments, via l'utilisation de paramètres d'événement et d'attributs d'élément. Cela permet de réduire le nombre d'événements inutiles et le travail des gestionnaires.
Cette gestion des événements peut également être étendue pour une intégration plus étroite de la bibliothèque c?té client avec le backend. Par exemple, ces bibliothèques Javascript émettent généralement des événements d'interaction utilisateur de niveau supérieur. Notre exemple de bibliothèque, json-view, ne fait pas cela, mais une bibliothèque de graphiques comme chart.js le fait.
Cependant, du point de vue de l'interaction utilisateur, un aller-retour vers le serveur pour le traitement doit généralement être évité. En règle générale, toute mise à jour de rendu basée sur des événements serait gérée par la bibliothèque de rendu c?té client.
Mais capturer l'activité des utilisateurs pour d'autres raisons est un cas d'utilisation courant. Cela inclut la surveillance, la journalisation et l’analyse. Ceux-ci ne nécessitent pas de réponse, donc pushEvent depuis un hook peut être idéal pour ce type de traitement asynchrone sur le serveur.
Conclusion
L'intégration de puissantes bibliothèques Javascript c?té client qui nécessitent un contr?le sur le DOM est un élément clé de la création d'interfaces utilisateur riches et dynamiques. Toutes les mises à jour des pages n'ont pas besoin d'être effectuées en temps réel, et conserver LiveView offre donc un moyen puissant mais simple de continuer à contr?ler l'état des autres pages.
Se familiariser avec les hooks LiveView et leurs événements associés permet de les intégrer aux données provenant du serveur. Il est également important de noter que toutes les interactivités utilisateur ne nécessitent pas un aller-retour vers le serveur, et les interfaces que vous créerez seront plus flexibles et réactives lorsque vous utiliserez de puissantes bibliothèques Javascript.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il existe trois fa?ons courantes d'initier des demandes HTTP dans Node.js: utilisez des modules intégrés, Axios et Node-Fetch. 1. Utilisez le module HTTP / HTTPS intégré sans dépendances, ce qui convient aux scénarios de base, mais nécessite un traitement manuel de la couture des données et de la surveillance des erreurs, tels que l'utilisation de https.get () pour obtenir des données ou envoyer des demandes de post via .write (); 2.AXIOS est une bibliothèque tierce basée sur la promesse. Il a une syntaxe concise et des fonctions puissantes, prend en charge l'async / attendre, la conversion JSON automatique, l'intercepteur, etc. Il est recommandé de simplifier les opérations de demande asynchrones; 3.Node-Fetch fournit un style similaire à la récupération du navigateur, basé sur la promesse et la syntaxe simple

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la cha?ne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

Bonjour, développeurs JavaScript! Bienvenue dans JavaScript News de cette semaine! Cette semaine, nous nous concentrerons sur: le différend de marque d'Oracle avec Deno, les nouveaux objets Time JavaScript sont pris en charge par les navigateurs, les mises à jour Google Chrome et certains outils de développeurs puissants. Commen?ons! Le différend de marque d'Oracle avec la tentative de Deno Oracle d'enregistrer une marque "JavaScript" a provoqué la controverse. Ryan Dahl, le créateur de Node.js et Deno, a déposé une pétition pour annuler la marque, et il pense que JavaScript est un niveau ouvert et ne devrait pas être utilisé par Oracle

Cacheapi est un outil fourni par le navigateur pour mettre en cache les demandes de réseau, qui est souvent utilisée en conjonction avec travailleur de service pour améliorer les performances du site Web et l'expérience hors ligne. 1. Il permet aux développeurs de stocker manuellement des ressources telles que des scripts, des feuilles de style, des photos, etc.; 2. Il peut faire correspondre les réponses du cache en fonction des demandes; 3. Il prend en charge la suppression des caches spécifiques ou la nettoyage du cache entier; 4. Il peut mettre en ?uvre des stratégies de priorité de cache ou de priorité de réseau grace à l'écoute des événements Fetch; 5. Il est souvent utilisé pour le support hors ligne, accélérez la vitesse d'accès répétée, préchargement des ressources clés et du contenu de mise à jour des antécédents; 6. Lorsque vous l'utilisez, vous devez faire attention au contr?le de la version du cache, aux restrictions de stockage et à la différence entre le mécanisme de mise en cache HTTP.

La promesse est le mécanisme central pour gérer les opérations asynchrones en JavaScript. Comprendre les appels de cha?ne, la gestion des erreurs et les combinants est la clé pour ma?triser leurs applications. 1. L'appel de la cha?ne renvoie une nouvelle promesse à travers. Puis () pour réaliser la concaténation des processus asynchrones. Chaque .then () re?oit le résultat précédent et peut renvoyer une valeur ou une promesse; 2. La gestion des erreurs doit utiliser .catch () pour attraper des exceptions pour éviter les défaillances silencieuses, et peut renvoyer la valeur par défaut dans Catch pour continuer le processus; 3. Combinateurs tels que promesse.all () (réussi avec succès uniquement après tout succès), promesse.race () (le premier achèvement est retourné) et promesse.allsetTled () (en attente de toutes les achèvements)

Des méthodes intégrées de la matrice JavaScript telles que .map (), .filter () et .reduce () peuvent simplifier le traitement des données; 1) .map () est utilisé pour convertir les éléments un en un pour générer de nouveaux tableaux; 2) .filter () est utilisé pour filtrer les éléments par condition; 3) .reduce () est utilisé pour agréger les données en tant que valeur unique; Une mauvaise utilisation doit être évitée lorsqu'elle est utilisée, entra?nant des effets secondaires ou des problèmes de performance.

La boucle d'événement de JavaScript gère les opérations asynchrones en coordonnant les piles d'appels, les webapis et les files d'attente de taches. 1. La pile d'appels exécute du code synchrone, et lors de la rencontre de taches asynchrones, il est remis à WebAPI pour le traitement; 2. Une fois que le WebAPI a terminé la tache en arrière-plan, il met le rappel dans la file d'attente correspondante (macro tache ou micro tache); 3. La boucle d'événement vérifie si la pile d'appels est vide. S'il est vide, le rappel est retiré de la file d'attente et poussé dans la pile d'appels pour l'exécution; 4. Micro taches (comme Promise. puis) ??prendre la priorité sur les taches macro (telles que Settimeout); 5. Comprendre la boucle d'événements permet d'éviter de bloquer le thread principal et d'optimiser l'ordre d'exécution du code.

Les bulles d'événements se propagent de l'élément cible vers l'extérieur vers le n?ud d'ancêtre, tandis que la capture d'événements se propage de la couche externe vers l'intérieur vers l'élément cible. 1. événements Bubbles: Après avoir cliqué sur l'élément enfant, l'événement déclenche l'auditeur de l'élément parent vers le haut. Par exemple, après avoir cliqué sur le bouton, il sortira d'abord cliqué sur l'enfant, puis parent. 2. Capture d'événement: définissez le troisième paramètre sur true, afin que l'auditeur soit exécuté dans l'étape de capture, tels que le déclenchement de l'écouteur de capture de l'élément parent avant de cliquer sur le bouton. 3. Les utilisations pratiques incluent la gestion unifiée des événements d'éléments enfants, le prétraitement d'interception et l'optimisation des performances. 4. Le flux d'événements DOM est divisé en trois étapes: capture, cible et bulle, et l'écouteur par défaut est exécuté dans l'étape de la bulle.
