Vue: L'espace insécable agit différemment des autres caractères - affiche "" dans le modèle lorsqu'il est passé via des accessoires

Créé le 4 oct. 2018  ·  11Commentaires  ·  Source: vuejs/vue

Version

2.5.17

Lien de reproduction

https://codepen.io/avertes/pen/LYYpNRe
https://jsfiddle.net/50wL7mdz/756973/

Étapes à suivre pour reproduire

  1. Créez un nouveau composant qui accepte un accessoire de chaîne.
  2. Affichez l'accessoire dans le modèle du composant.
  3. Utilisez le composant dans une application Vue et passez une chaîne contenant un caractère d'espace insécable pour l'accessoire.

Qu'attend-on?

La sortie doit contenir un espace insécable

Que se passe-t-il réellement?

La sortie affiche  


Dans l'exemple fourni, j'ai fait 3 cas

  • Le premier cas est que   est transformé en  
  • Le deuxième cas est que dans une longue liste de caractères UTF-8, seul NON-BREAKING SPACE est échappé.
  • Et troisièmement, lorsque vous obtenez la même liste de caractères, mais que vous la récupérez à partir d'un HTMLElement normal avec document.querySelector('#test').title le caractère n'est pas d'échappement.

Remarque : lors de la copie du caractère d'espace insécable, il peut se transformer en un espace régulier dans le presse-papiers. Pour cela, utilisez https://en.wikipedia.org/wiki/Non-breaking_space#Keyboard_entry_methods pour vous assurer de la manière d'insérer le caractère.

bug

Commentaire le plus utile

comme solution de contournement, essayez de mettre le code d'échappement JS pour   - \xa0

trouvé ici , a travaillé pour moi dans la fonction nonbreakinspacification

    public static noBreakingSpaces(str: string): string {
        return str.replace(' ', '\xa0');
    }

les chaînes retournées par cette fonction sont rendues avec &nbsp s au lieu d'espaces.

Tous les 11 commentaires

J'ai ajouté un nouvel exemple - où dans une liste d'entités html (y compris d'autres espaces et des caractères de largeur nulle) - seulement   non décodé.

J'ai aussi remarqué que dans mathiasbynens / he il y a deux entrées pour   une sans simicolon et une avec simicolon.

Peut-être une photo dans le noir, mais cela pourrait-il avoir une influence sur le résultat ci-dessus?

J'ai essayé d'utiliser mathiasbynens / he v1.1.1 pour trouver des incohérences avec   , mais je n'ai pas pu en trouver.

J'ai essayé de dupliquer mes jsfiddles précédents, pour voir si   réagirait différemment.

Si quelqu'un peut me donner des indications pour savoir où rechercher cette erreur, je suis plus qu'heureux de l'essayer.

J'apprécierais également beaucoup toute réponse sur la question.

Cela me semble être un bug - un correctif serait bien

J'ai remarqué des problèmes avec × à l'occasion. disons qu'un accessoire de composant a une valeur par défaut de × , qui est rendu dans le composant (v-html). Lors du rendu, il affiche le caractère réel x et provoque une caution d'hydratation SSR.

Autre exemple: https://jsfiddle.net/onbzk0m6/ (caractère)

Ouais - cela semble être lié à la façon dont Vue analyse les attributs html en général.

J'ai fait un exemple similaire basé sur l'exemple @approached
https://jsfiddle.net/onbzk0m6/3/

comme solution de contournement, essayez de mettre le code d'échappement JS pour   - \xa0

trouvé ici , a travaillé pour moi dans la fonction nonbreakinspacification

    public static noBreakingSpaces(str: string): string {
        return str.replace(' ', '\xa0');
    }

les chaînes retournées par cette fonction sont rendues avec &nbsp s au lieu d'espaces.

Je suis tombé sur le même problème: l'entité html donne "" comme texte lorsqu'elle est utilisée dans des modèles au lieu du trait d'union souple. Idem pour "" et autres.
Vue 2.6.10

pour les personnes qui recherchent une solution de contournement pour cela:
Lors du passage d'une chaîne avec des espaces insécables comme accessoire, je viens de remplacer les espaces par des caractères peu susceptibles de faire partie de la chaîne, dans mon cas 'zzz'
var newName = program_name.replace(/\s/g,'zzz');

Ensuite, dans le composant réel où j'ai besoin d'afficher ou d'utiliser cet accessoire, j'ai une fonction calculée qui annule l'action ci-dessus et remplace à nouveau les caractères d'espace réservé par des espaces

correctedProgramName(){ //this reverses the space-replacing we had to do in reporting-dashboard.js
        let correctedProgramName = this.program_name.replace(/zzz/g, ' ')
        return correctedProgramName
      }

@posva Désolé de vous déranger, j'ai trouvé une solution à ce problème.

Après ma correction, le comportement de Vue sera le même que HTML, tout comme la capture d'écran ci-dessous,

Puis-je résoudre ce problème et faire une demande d'extraction?

image

image

Bien sûr @JuniorTour

Ce problème peut être lié à https://github.com/vuejs/vue/issues/10485 et https://github.com/vuejs/vue/issues/11059
Il vaut donc la peine de jeter un œil aux PR existants

Cette page vous a été utile?
0 / 5 - 0 notes