Vue: El espacio sin interrupciones actúa de manera diferente a otros caracteres: genera "" en la plantilla cuando se pasa a través de accesorios

Creado en 4 oct. 2018  ·  11Comentarios  ·  Fuente: vuejs/vue

Versión

2.5.17

Enlace de reproducción

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

pasos para reproducir

  1. Cree un nuevo componente que acepte un accesorio de cadena.
  2. Muestre el accesorio dentro de la plantilla del componente.
  3. Use el componente en una aplicación Vue y pase una cadena que contenga un carácter de espacio que no se rompa para el accesorio.

¿Lo que es esperado?

La salida debe contener un espacio que no se rompa

¿Qué está pasando realmente?

La salida muestra  


En el ejemplo proporcionado, hice 3 casos.

  • El primer caso es que   se convierten en  
  • El segundo caso es que en una lista larga de caracteres UTF-8 solo se escapa NON-BREAKING SPACE .
  • Y tercero cuando se obtiene la misma lista de caracteres, pero se recupera de un HTMLElement normal con document.querySelector('#test').title el carácter no es un escape.

Nota : Al copiar el carácter de espacio que no se separa, puede convertirse en un espacio normal en el portapapeles. Por lo tanto, use https://en.wikipedia.org/wiki/Non-breaking_space#Keyboard_entry_methods para asegurarse de cómo insertar el carácter.

bug

Comentario más útil

como solución alternativa, intente poner el código de escape JS para   - \xa0

encontrado aquí , funcionó para mí en la función de no romper la opacificación

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

Las cadenas devueltas por esta función se representan con &nbsp s en lugar de espacios.

Todos 11 comentarios

Agregué un nuevo ejemplo, donde en una lista de entidades html (incluidos otros espacios en blanco y caracteres de ancho cero), solo   no decodificados.

También he notado que en mathiasbynens / he hay dos entradas para   una sin simicolon y otra con simicolon.

Podría ser un disparo en la oscuridad, pero ¿podría esto tener alguna influencia en el resultado anterior?

Intenté usar mathiasbynens / he v1.1.1 para encontrar inconsistencias con   , pero no he podido encontrar ninguna.

Intenté duplicar mis jsfiddles anteriores, para ver si   reaccionaría de manera diferente.

Si alguien me puede dar algunos consejos sobre dónde buscar este error, estoy más que feliz de intentarlo.

También agradecería mucho cualquier respuesta al tema.

Me parece un error; una solución sería buena

He notado problemas con × en ocasiones. digamos que una propiedad de componente tiene un valor predeterminado de × , que se representa en el componente (v-html). Al renderizar, muestra el carácter x real y provoca una fianza de hidratación SSR.

Otro ejemplo: https://jsfiddle.net/onbzk0m6/ (personaje)

Sí, parece estar relacionado con la forma en que Vue analiza los atributos html en general.

Hice un ejemplo similar basado en el ejemplo @approcted
https://jsfiddle.net/onbzk0m6/3/

como solución alternativa, intente poner el código de escape JS para   - \xa0

encontrado aquí , funcionó para mí en la función de no romper la opacificación

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

Las cadenas devueltas por esta función se representan con &nbsp s en lugar de espacios.

Me encontré con el mismo problema: la entidad html da como resultado "" como texto cuando se usa en plantillas en lugar del guión suave. Lo mismo para "" y otros.
Vue 2.6.10

para las personas que buscan una solución alternativa para esto:
Al pasar una cadena con espacios que no se rompen como accesorio, simplemente reemplacé los espacios con caracteres que es poco probable que formen parte de la cadena, en mi caso 'zzz'
var newName = program_name.replace(/\s/g,'zzz');

Luego, en el componente real donde necesito mostrar o usar este accesorio, tengo una función calculada que deshace la acción anterior y reemplaza los caracteres del marcador de posición con espacios nuevamente

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 Lamento molestarlo, encontré una solución para este problema.

Después de mi corrección, el comportamiento de Vue será el mismo que HTML, al igual que la captura de pantalla a continuación,

¿Puedo recoger este problema y realizar una solicitud de extracción?

image

image

Seguro @JuniorTour

Este problema puede estar relacionado con https://github.com/vuejs/vue/issues/10485 y https://github.com/vuejs/vue/issues/11059
Por lo que también vale la pena echar un vistazo a los RP existentes

¿Fue útil esta página
0 / 5 - 0 calificaciones