Encapsulación de componentes Vue

1. Por qué empaquetar componentes (desarrollo de componentes)

Los beneficios del desarrollo de componentes (componentes de encapsulación)


Los beneficios son obvios, lo que puede aumentar la reutilización y flexibilidad del código, mejorando así la eficiencia del desarrollo. Imagínese si un cuadro emergente se puede usar en muchas páginas de un proyecto, si escribe un conjunto de estilo de estructura de cuadro emergente y la lógica js correspondiente en cada página. En este caso, la eficiencia del desarrollo se reducirá considerablemente, por supuesto, ahora hay muchas bibliotecas de componentes excelentes, pero solo estamos familiarizados con la encapsulación de componentes a través de este caso.

Actualmente se utilizan tres puntos de habilidad en la encapsulación de componentes:


1 Pasar valores de padre a hijo
2. Pasar valores de hijo a padre
3. Tecnología de tragamonedas (presentada al final del artículo)
Además, hay algunos puntos de conocimiento triviales en este artículo: El modificador de atributo .sync permite que nuestros componentes secundarios modifiquen los valores pasados ​​por el componente principal Attribute
Time Modifier.self .stop
La etiqueta de animación integrada en vue <transition>
El componente principal modifica los datos en el componente secundario

Dos, construcción de estructura de componente de diálogo


El cuadro de diálogo tiene un efecto de animación en su conjunto, el efecto de animación de vue, use la transición para envolver el elemento que necesita ser animado, luego este elemento agregará automáticamente algunos nombres de clase cuando se muestre/oculte, vea el seguimiento código para obtener detalles en este ejemplo

Requisitos :

●El cuadro emergente aparece o se cierra para configurar la animación de transición.
●Utilice la ranura predeterminada como área de contenido principal.
●Utilice la ranura con nombre para especificar el contenido de la cabecera y la parte inferior del cuadro emergente.
● Abra o cierre el fondo de la capa de máscara del cuadro emergente
. La capa controla si el cuadro de viñetas está cerrado o no
. Si se muestra el icono de cruz cerrada
. Personalice el título del cuadro de viñetas.

Análisis :
el cuadro de diálogo se divide en tres partes:
1. Encabezado: el lado izquierdo es el título, usando el título de la ranura nombrada para ocupar el lugar, y el lado derecho es el botón/icono (cerrado)
2. El contenido principal, usando la ranura sin nombre para ocupar el lugar
3, Abajo: generalmente algunas operaciones, use el pie de página de la ranura con nombre para ocupar el lugar, generalmente el contenido es el botón cancelar/confirmar

Parámetros que deben pasarse en: título: ancho
del título del encabezado : diálogo
ancho (creo que también se puede usar en el nivel principal especificado en profundidad)
superior: la distancia desde la parte superior del cuadro de diálogo
hasta visible: la visualización/ocultación del cuadro de diálogo
 

Código de implementación específico:
1. Cree un nuevo archivo Dialog.vue en componentes bajo el directorio raíz src

<template> 
  <!-- Abra la animación del cuadro emergente --> 
  <!-- La etiqueta de animación integrada de Vue formará 6 estilos de acuerdo con el atributo del nombre. La 
    animación entra en tres estados 
    dialog-fade-enter ready para ingresar 
    dialog-fade-enter-active En el proceso de ingresar 
    dialog-fade-enter-to La animación ingresa al final 

    dialog-fade-leave La animación está lista para salir 
     dialog-fade-leave-active La animación está en proceso de dejar 
      dialog-fade-leave-to La animación sale completa 
    --> 
  <transition name="dialog-fade"> 
    <!-- sombra translúcida de div para toda la pantalla--> 
    <div 
      class="dialogBox" 
      :class ="{ isShowMask: mask == true }" 
      v-show="isShowDialog " 
      @click.self="clickMaskCloseFn" 
    > 
      <!-- cuadro emergente --> 
      <div class="dialogBoxContent" @click.stop>
        <div class="headhead"> 
          <!-- El valor predeterminado de la ranura nombrada con la ranura: Esto se puede escribir de modo que si hay un título aprobado, use el título aprobado. Si hay una ranura aprobada, use el plug- 
          in El slot prevalece --> 
          <slot name="header"> 
            <span>{ 
   
   { title }}</span> 
          </slot> 
          <i class="el-icon-close" @click="close" v- show="showCloseIcon">X </i> 
        </div> 
        <div class="bodybody"> 
          <!-- Usamos la ranura predeterminada en el área de contenido--> 
          <slot></slot> 
        </ div> 
        <div class="footfoot"> 
          <!-- Usar ranuras con nombre en la parte inferior --> 
          <slot name="footer"></ranura> 
        </div> 
      </div> 
    </div> < 
  /transición> 
</plantilla>

<script>  
exportar por defecto {
  name: 'dialogComponent', 
  props: { 
    // Controlar si mostrar u ocultar el diálogo 
    isShowDialog: { 
      type: Boolean, 
      default: false 
    }, 
    // El valor del título pasado desde el 
    título del componente principal: { 
      type: String , 
      por defecto: '' 
    }, 
    // Si mostrar el pequeño ícono de cierre 
    showCloseIcon: { 
      type: Boolean, 
      default: true 
    }, 
    // Si se debe habilitar la 
    máscara de capa de máscara de fondo: { 
      type: Boolean, 
      default: true 
    }, 
    / / Ya sea para hacer clic en la máscara Máscara de capa para cerrar el cuadro emergente 
    haga clic en MáscaraCerrar: { 
      tipo: booleano, 
      predeterminado: falso 
    } 
  }, 
  datos () { 
    return {} 
  }, 
  métodos: { 
    // cierre el cuadro emergente 
    close () { 
      this.$emit('update:isShowDialog', false) 
    }, 
    // haga clic en la capa de máscara para cerrar el cuadro emergente 
    clickMaskCloseFn ( ) { 
      if (this.clickMaskClose === true) { 
        this.$emit('update:isShowDialog', false) 
      } else { 
        /* Aquí necesitamos controlar el evento burbujeante. Tenga en cuenta que la décima línea usa @click.stop 
           para no controlar el burbujeo, al hacer clic en el área de contenido también se cerrará el cuadro emergente*/ } } } } 
      </script> 
    < 
  style 
lang 
= 

"scss" scoped> 
.dialogBox { 
  ancho: 100%; 
  alto: 100%; 
  posición: fija, 
  arriba: 0, 
  izquierda: 0;
  pantalla: flexible; 
  justificar-contenido: centro; 
  alinear elementos: centro; 
  .dialogBoxContent { 
    ancho: 500px; 
    altura: 220px; 
    borde: 2px sólido #e9e9e9; 
    borde-radio: 20px; 
    color de fondo: #fff; 
    .headhead { 
      ancho: 100%; 
      altura: 60px; 
      altura de línea: 60px; 
      borde inferior: 1px sólido #e9e9e9; 
      tamaño de caja: caja de borde; 
      relleno: 20px; 
      pantalla: flexible; 
      justificar-contenido: espacio-entre; 
      alinear elementos: centro; 
      span { 
        tamaño de fuente: 24px; 
      } 
      yo { 
        tamaño de fuente: 24px; 
        cursor: puntero; 
      }
    } 
    .cuerpocuerpo { 
      ancho: 100%; 
      altura: calc(100% - 120px); 
    } 
    .footfoot { 
      ancho: 100%; 
      altura: 60px; 
      altura de línea: 60px; 
      tamaño de caja: caja de borde; 
      borde superior: 1px sólido #e9e9e9; 
      relleno: 0 20px; 
      .el-boton { 
        margen izquierdo: 12px; 
      } 
    } 
  } 
} 
.isShowMask { 
  color de fondo: rgba(0, 0, 0, 0.3); 
} 
.dialog-fade-enter, 
.dialog-fade-leave-to { 
  opacidad: 0; 
}  
.dialog-fade-enter-activo,
.dialog-fade-leave-active { 
  transición: opacidad 0.3s; 
}
 
// También puede definir una animación como esta 
// ingrese animación 
// .dialog-fade-enter-active { 
// animación: diálogo-fade-in 0.4s ; 
// } 
// // Deja la animación 
// .dialog-fade-leave-active { 
// animación: dialog-fade-out 0.4s; 
// } 

// @keyframes dialog-fade-in { 
// 0% { 
// transformar: traducir3d(0, -20px, 0); 
// opacidad: 0; 
// } 
// 100% { 
// transformar: traducir3d(0, 0, 0); 
// opacidad: 1; 
// } 
// } 

// @keyframes dialog-fade-out { 
// 0% { 
// transform: translate3d(0, 0, 0); 
// opacidad: 1;
// }  
// 100% { 
// transformar: traducir3d(0, -20px, 0);
// opacidad: 0; 
// } 
// } 
</estilo>


2 componentes registrados globalmente (main.js)

importar NewDialog from '@/components/Dialog' 
Vue.component('myDialog', NewDialog) 


3. Llamadas en componentes empresariales
<!-- 
      sync: modificador de eventos, es un método de escritura gramatical de azúcar, que se da cuenta de que el componente secundario modifica los apoyos pasados ​​por el componente principal parent 
      : visible.sync="visible" 
      child: this.$emit("update: visible", false) 
    --> 
    <my-dialog 
      :isShowDialog.sync="isShowDialog" 
      title="Establecer título" 
      :showCloseIcon="true" 
      :mask="true" 
      :clickMaskClose="true" 
    > 
      <!-- El Complemento con nombre que se conectará con el componente Correspondencia de ranura --> 
      <plantilla #header> Ranura con nombre</plantilla> 
      <plantilla> Ranura predeterminada</plantilla> 
      <!-- Para corresponder a la ranura del subcomponente --> 
      <template #footer> 
        <van- button size="pequeño" @click="isShowDialog = false">Cancelar</van-button> 
      > 取消</van-button> 
        <van-button type="primary" size="small" @click="isShowDialog = false"
          Confirmar</van-button> 
        </template> 
    </my-dialog> 
    <van-button @click="isShowDialog = true" type="primary">cuadro modal</van-button>

3. Revisión y resumen de puntos de conocimiento

por qué hay tragamonedas


El nacimiento de la api de tragamonedas proviene de las necesidades de la transferencia de datos de Vue, porque generalmente usamos accesorios para transferir datos de padres a hijos, y los datos transferidos son todos "datos de tipo js", como objetos, matrices y cadenas. ¿Qué debemos hacer cuando queremos pasar una gran cantidad de fragmentos de datos de tipo html?
Existe tal demanda, por lo que surgió la tecnología de tragamonedas.
En la programación por componentes, no es necesario pasar css, porque podemos usar selectores de alcance profundo, como /deep/, para seleccionar el elemento dom en el componente secundario en el componente principal para establecer el estilo.

Clasificación de tragamonedas


●Ranura predeterminada (también conocida como: ranura ordinaria, ranura única, ranura anónima. Es decir, sin nombre, no es necesario establecer el atributo de nombre <ranura></ranura>) ●Ranura con nombre (
con un nombre< nombre de la ranura= "footer"></slot>, que tiene el atributo de nombre)
Scope slot (este es un uso ligeramente avanzado de la ranura, en lo que respecta al caso, es útil en la tabla en la interfaz de usuario de Ele.me Para)
Las ranuras se pueden ver en componentes encapsulados en Ele.me UI o ant D. Tome el-dialog como ejemplo, que usa ranuras predeterminadas y ranuras con nombre. Se puede decir que la tecnología de socket se utiliza básicamente en los componentes de la interfaz de usuario. Si tiene libertad, puede ir y ver el código fuente de los componentes del paquete de la interfaz de usuario de Ele.me. Hay muchos paquetes/componentes, busque los paquetes
en elemento -ui, que son todas
las ranuras de alcance de componentes empaquetadas por Ele.me. Este artículo no se utilizará por el momento, así que presione el botón primero y luego escriba un artículo separado sobre las funciones Artículos de ranura de dominio

Uso de ranura anónimo (predeterminado)

Los subcomponentes colocan ranuras anónimas

<template> 
  <div class="box"> 
    <h1>Soy un subcomponente</h1> 
<!-- El primer paso, en el subcomponente, encontrar un lugar para insertar una ranura, porque la ranura puede contener cosas, y Debido a que el componente secundario se introducirá en el componente principal 
, el componente principal debe cargar el contenido específico de la ranura insertada por el componente secundario. El componente principal carga el fragmento html, y el 
fragmento html se puede obtener en el componente secundario. . Entonces: la ranura se da cuenta del efecto del componente principal que pasa datos al componente secundario 
  --> 
  <ranura></ranura> 
<!-- el componente secundario escribe una etiqueta de ranura para recibir el fragmento html pasado por el componente principal. Si no lo escribe, el componente principal se pasará en vano, es decir, 
no se generará DOM y no se procesará 
  --> 
  </div> 
</template> 

<script> 
  export default { 
nombre : "DemoChildslot", 
}; 
</script> 

< estilo lang="less" scoped> 
  .box { 
    ancho: 200px; 
    alto: 200px; 
    color de fondo: #baf;

El componente principal pasa HTML usando una ranura anónima

<template> 
  <div id="app"> 
    <!-- El segundo paso 
            es usar subcomponentes y escribir código en medio de las etiquetas de los subcomponentes para realizar la transferencia de datos de la ranura. --> 
    <child-slot> 
      <i>Lo pasé desde el componente principal</i> 
      <!-- 
        También se puede escribir así, porque el valor predeterminado es slot="default", pero generalmente no se escribe así, es un poco problemático 
        <i slot="default">El componente padre me pasó</i> 
      --> 
    </child-slot> 
  </div> 
</template> 

<script> 
// Introducir el componente secundario 
importa childSlot desde "./childSlot"; 
exporta los {componentes predeterminados 
  : { 
    childSlot, // registra el componente secundario 
  }, 
}; 
</script> 

<style lang="less" scoped> 
#aplicación { 
  ancho: 100%; 
  min-altura: 100vh; 
  tamaño de caja: caja de borde;
  relleno: 50px; 
} 
</estilo>

representaciones

Uso de ranuras con nombre
Por ejemplo, si queremos empaquetar un componente de cuadro de viñetas, después de que aparece el cuadro de viñetas, en el área de contenido del cuadro de viñetas, está el área de contenido del encabezado del cuadro de viñetas, el área de contenido principal del cuadro de viñetas y el área de contenido inferior del cuadro de viñetas. Podemos usar ranuras anónimas en el área de contenido principal del cuadro de viñetas.Si el cuadro de viñetas necesita especificar el contenido del encabezado y el contenido inferior del cuadro de viñetas, puede especificar el contenido específico a través de la ranura con nombre. El código de la estructura es el siguiente:

Los subcomponentes colocan ranuras con nombre


<style lang="less" scoped> 
.box { 
  ancho: 170px; 
  altura: 200px; 
} 
</estilo>


  color de fondo: #baf;

Use ranuras con nombre para pasar HTML en el componente principal

<template> 
  <div id="app"> 
    <child-slot> 
      <!-- Método de escritura 1: el atributo de la ranura se escribe en la etiqueta. 
              Cuando la ranura nombrada pasa datos en el componente principal, la posición no importa, porque se pasa la ranura con nombre Los datos 
              encontrarán la ranura con nombre en el subcomponente correspondiente de acuerdo con el nombre de la ranura con nombre. 
       --> 
      <!-- <p slot="footfoot">Bottom bottom</p> 
      <i>Me pasa el componente padre</i> 
      <p slot="headhead">head head</p > - -> 

      <!-- Método de escritura 2: el atributo de espacio se escribe en la etiqueta de plantilla y la etiqueta de plantilla no se representará en DOM --> 
        <template slot="headhead"> 
          <p>Encabezado de etiqueta de plantilla</p > 
        </ template> 
        <i>Me pasó el componente principal</i> 
        <template slot="footfoot"> 
          <p>Parte inferior de la etiqueta de la plantilla</p>

importar childSlot desde "./childSlot"; 
exportar por defecto { 
  componentes: { 
    childSlot, // 注册子组件
  }, 
}; 
</script> 

<style lang="less" scoped> 
#app { 
  ancho: 100%; 
  min-altura: 100vh; 
  tamaño de caja: cuadro de borde; 
  relleno: 50px; 
} 
</estilo>

representaciones

Supongo que te gusta

Origin blog.csdn.net/asfasfaf122/article/details/128787963
Recomendado
Clasificación