1. Tragamonedas en vue
1.1 El problema a resolver por la ranura en vue
La ranura ranura se utiliza en componentes para distribuir contenido a los componentes. Su contenido puede contener cualquier cosa 模板代码
, incluso HTML
. Resolverá los siguientes problemas:
<template>
<div>
<p>buttonTest</p>
<my-button>
<!-- 处于自定义标签中的内容,如何呈现 -->
button
</my-button>
</div>
</template>
<script>
import MyButton from "./MyButton.vue";
export default {
components: {
"my-button": MyButton,
},
props: {
},
data() {
return {
};
},
methods: {
},
};
</script>
En 自定义组件
, 标签中间的内容
cómo renderizar.
1.2 Desarrollo de tragamonedas en vue
En vue 2.6.0
, las ranuras con nombre y las ranuras con ámbito introducen una nueva sintaxis unificada (es decir, v-slot
directiva). Reemplaza slot
y , slot-scope
dos características actuales 已被废弃但未被移除
y aún útiles. Pero vue 3
estos dos quedarán obsoletos en , 不会被支持即无效
.
2. Tragamonedas anónimas
<template>
<div>
<!-- slot里面也可以设置内容,这个可以设置不传内容时,slot有个默认值替换 -->
<slot>这里面是slot的默认值</slot>
</div>
</template>
<script>
export default {
name: "MyButton",
props: {
},
data() {
return {
};
},
methods: {
},
};
</script>
<template>
<div>
<p>buttonTest</p>
<my-button>
button
</my-button>
</div>
</template>
<script>
import MyButton from "./MyButton.vue";
export default {
name: "HelloWorld",
components: {
"my-button": MyButton,
},
props: {
},
data() {
return {
};
},
methods: {
},
};
</script>
- El método anónimo se refiere a enviar la
引用组件
hora a la ubicación de la página del componente .里面传的内容
全部一起
<slot></slot>
- Mientras haya en el componente
<slot></slot>
, y不管有多少个
lo hará全部渲染为传过来的内容
. Significa que si hay más de uno<slot></slot>
, entonces el contenido pasado será渲染多次
. <slot></slot>
También puede establecer el contenido en el interior, que es para asegurarse de que haya uno cuando se introduzca el componente默认值
. Por supuesto,<slot></slot>
está bien no configurar el contenido en él, por lo que simplemente no hay un valor predeterminado, sí不会报错
.- El contenido entregado también puede ser dinámico.
- Si el contenido pasado,
没有slot 来接收
entonces, el contenido pasado será被抛弃掉
,不会起作用
.
3. Ranuras con nombre
<template>
<div>
<slot name="icon"></slot>
<slot name="content"></slot>
</div>
</template>
<script>
export default {
name: "MyButton",
props: {
},
data() {
return {
};
},
methods: {
},
};
</script>
<template>
<div>
<p>2.6.0以前的写法</p>
<my-button>
<!--2.6.0以前的写法-->
<template slot='icon'>
+
</template>
<template slot='content'>
新建
</template>
</my-button>
<p>--------------------------------------------</p>
<p>2.6.0之后的写法</p>
<my-button>
<!--2.6.0之后的写法-->
<template v-slot:icon>
+
</template>
<template v-slot:content>
新建
</template>
</my-button>
</div>
</template>
<script>
import MyButton from "./MyButton.vue";
export default {
name: "HelloWorld",
components: {
"my-button": MyButton,
},
props: {
},
data() {
return {
};
},
methods: {
},
};
</script>
La ranura con nombre es asignar un nombre a la ranura y luego corresponder uno por uno
- Versiones anteriores a la 2.6.0
- Si la página que presenta el componente tiene varios contenidos, debe envolverse
template
con y agregarslot
el atributo y自定义值
. slot 的值
<slot name='xxx'></slot>
name的值
Tiene que corresponder al componente .- Si
剩下的内容
no se ajusta y especifica, el contenido se representará en所有的 <slot></slot>
la ubicación del componente. - Si
slot 设置为default
yname 设置为default
, entonces和没设置slot与name是一样的
. - En comparación con
vue 2.6.0
las ranuras nombradas en el futuro, solo es necesario cambiarlas a , , , .template
slot='xxx'
v-slot:xxx
等号改成了冒号
并且值没有引号
带引号反而会报错
- Las ranuras con nombre solo necesitan corresponder
name值
aslot的值
la ranura顺序是没有关系的
.
- Si la página que presenta el componente tiene varios contenidos, debe envolverse
- Versiones posteriores a la 2.6.0
v-slot
Solo se puede usar en componentescomponent
otemplate
, y se usará en etiquetas comodiv
op
报错
slot=' xxx '
cambiadov-slot:xxx
, y冒号后面这个名称不能打引号
- El contenido de la página del componente
slot
no cambia. - Después de 2.6.0, la ranura nombrada
v-slot:header
se puede abreviar como#header
, ¡debe tener参数
la capacidad de escribir de esta manera!#= "xxx "
Esto no es posible,#default = 'xxx'
esta es la única manera.
4. Ranura para mira telescópica
<template>
<div>
<!--这里最重要的是 :anyName=value,anyName也是可以随便取的,表示要传过去的值-->
<slot name="icon" :anyName="defaultConfig"></slot>
<!--这里最重要的是 :anyName=value,anyName也是可以随便取的,表示要传过去的值-->
<slot name="content" :anyName="defaultConfig"></slot>
</div>
</template>
<script>
export default {
name: "MyButton",
props: {
},
data() {
return {
defaultConfig: {
icon: "+",
content: "新建",
},
};
},
methods: {
},
};
</script>
<template>
<div>
<p>2.6.0以前的写法</p>
<my-button>
<!--这里的anyName对应 slot 中传值 :name=value 中的 name-->
<template slot="icon" slot-scope="{ anyName }">
{
{ anyName.icon }}
</template>
<!--这里的obj是随便取的名称,不与任何地方对应-->
<template slot="content" slot-scope="obj">
{
{ obj.anyName.content }}
</template>
</my-button>
<p>--------------------------------------------</p>
<p>2.6.0之后的写法</p>
<my-button>
<!--这里的anyName对应 slot 中传值 :name=value 中的 name-->
<template v-slot:icon="{ anyName }">
{
{ anyName.icon }}
</template>
<!--这里的obj是随便取的名称,不与任何地方对应-->
<template v-slot:content="obj">
{
{ obj.anyName.content }}
</template>
</my-button>
</div>
</template>
<script>
import MyButton from "./MyButton.vue";
export default {
name: "HelloWorld",
components: {
"my-button": MyButton,
},
props: {
},
data() {
return {
};
},
methods: {
},
};
</script>
- Versiones anteriores a la 2.6.0
- Las ranuras con ámbito se utilizan principalmente
使用子组件的任何数据
para lograr自定义显示内容
el propósito de - El paso más importante de las ranuras con ámbito es que,
<slot></slot>
si绑定数据
,没有绑定数据
el componente principal recibe solo un objeto vacío{}
. - Vincular datos en ranuras con ámbito
<slot></slot>
, puede ser写死的
o puede ser动态绑定的
. Si está enlazado dinámicamente, también necesitav-bind:xxx
- Los datos enlazados en la ranura del alcance
<slot></slot>
también pueden pasar un definido有返回值的 methods 方法
- Una vez
<slot></slot>
enlazados los datos,引用组件的地方
el contenido enviado se puede pasarslot-scope
a través de获取
. obtenido内容
, es一个对象
slot-scope
Expresiones aceptables任何有效
que pueden aparecer en posiciones de parámetros de definiciones de funcionesJavaScript
.
- Las ranuras con ámbito se utilizan principalmente
- Versiones posteriores a la 2.6.0
两个属性
合并
se convirtió en unov-slot:插槽名称='传过来的值'
.- El contenido de la página del componente
slot
no ha cambiado. v-slot
No debe usarsehtml
en etiquetas.- En caso afirmativo
默认插槽
, se puede escribir comov-slot='xxx'
.
5. Nombre de la ranura dinámica
Los parámetros de directiva dinámica también se pueden usar v-slot
para definir 动态的插槽名
:
<base-layout>
<template v-slot:[dynamicSlotName]>
...
</template>
</base-layout>
6. Asignación de deconstrucción del contenido de la tragamonedas
v-slot
JavaScript
El valor de es aceptable siempre que satisfaga la expresión definida por el parámetro de función . Por lo tanto, en entornos compatibles (navegadores de archivo único o modernos), también puede ES2015
解构语法
extraer contenido interpolado específico con, por ejemplo:
<template>
<div>
<slot name="icon" :anyName="defaultConfig"></slot>
<slot name="content" :anyName="defaultConfig"></slot>
</div>
</template>
<script>
export default {
name: "MyButton",
props: {
},
data() {
return {
defaultConfig: {
add: {
icon: "+",
content: "新建",
},
},
};
},
methods: {
},
};
</script>
<template>
<div>
<my-button>
<template v-slot:icon="{ anyName }">
{
{ anyName.add.icon }}
</template>
<template v-slot:content="{ anyName: { add } }">
{
{ add.content }}
</template>
</my-button>
</div>
</template>
<script>
import MyButton from "./MyButton.vue";
export default {
name: "HelloWorld",
components: {
"my-button": MyButton,
},
props: {
},
data() {
return {
};
},
methods: {
},
};
</script>
7. Comparación de versiones anteriores y posteriores a la 2.6.0
Versiones anteriores a la 2.6.0 | Versiones posteriores a la 2.6.0 | |
---|---|---|
ranura anónima | Componente principal: <template>content<template> Componente secundario: <slot></slot> |
Componente principal: <template>content<template> Componente secundario: <slot></slot> |
ranura con nombre | Componente principal: <template slot="slotName"><template> Componente secundario: <slot name="slotName"></slot> |
Componente principal: <template v-slot:slotName><template> Componente secundario: <slot name="slotName"> Taquigrafía: <template #slotName><template> |
Ranuras con alcance | Componente principal: <template slot="slotName" slot-scope="obj"><template> Componente secundario: <slot name="slotName" :anyName="data"></slot> |
Componente principal: <template v-slot:slotName="obj"><template> Componente secundario: <slot name="slotName" :anyName="data"></slot> Taquigrafía: <template #slotName="obj"><template> |
ubicación utilizada | Se puede utilizar en cualquier etiqueta, como:<p slot="slotName" slot-scope="data">{
{ data }}</p> |
Sólo se puede utilizar en componentes component otemplate |