vue slot 02-scope slot $ parent, $ children, componente recursivo


Sugerencia: El siguiente es el contenido de este artículo, los siguientes casos son para referencia

4. Ranura de alcance

Sitio web oficial: a veces es útil permitir que el contenido de la ranura acceda a datos que solo están disponibles en subcomponentes.

La arquitectura general se refiere a la ranura vue 01 en el artículo anterior.
A veces, desea cambiar el contenido de la copia de seguridad. Por ejemplo, el contenido de la plantilla del componente Wrap es el siguiente:

App.vue
	<Wrap> 
	//这里为空时填充备用内容
	// {
    
    {value}} 这里是获取不到Wrap组件中的value
    </Wrap>
Wrap.vue
	<h1>wrap</h1>
    <slot> 
     这是slot标签内容备用内容{
    
    {
    
    value}}
    </slot>
    <p>这是wrap的P标签</p>
    <hr />

Para que el valor esté disponible en el contenido de la ranura principal, podemos vincular el valor como un atributo del elemento :

Nota: la ranura v solo se puede agregar a la plantilla, y solo aquellos que reciben el valor en ella pueden escribir directamente así

App.vue
	<h1>wrap</h1>
	//注意v-slot只能添加在template上,只有在里面接收值的可以这样直接写
	<Wrap v-slot:default="wrapValue">  
      {
    
    {
    
    wrapValue}}
      <Box :title="wrapValue.data"/> //Box组件也可以获取到这个值
    </Wrap>
Wrap.vue 	
	    <h1>wrap</h1>
	    <slot :data="value"> //进行绑定
	     这是slot标签内容备用内容{
    
    {
    
    value}}
	    </slot>
	    <hr />
    <script>
		export default {
    
    
		  data() {
    
    
		    return {
    
    
		      value: "wrap-value",
		    }
		  },
		};
	</script>
Box.vue	  
	   <h2>Box</h2> {
    
    {
    
    title}}
	<script>
	export default {
    
    
	  props: {
    
    
	    title: String,
	  }
	};
	</script>

Inserte la descripción de la imagen aquí
Deconstruye la ranura:

	<Wrap v-slot:default="{data}"> 
      {
    
    {
    
    data}}
      <Box :title="data"/>
    </Wrap>

Inserte la descripción de la imagen aquí

  1. Se supone que la ranura en V sin parámetros corresponde a la ranura predeterminada:
  2. Tenga en cuenta que la sintaxis abreviada de la ranura predeterminada no se puede mezclar con la ranura nombrada, porque hará que el alcance sea ambiguo
  3. Siempre que haya varios espacios, utilice siempre la sintaxis completa basada en plantillas para todos los espacios.
    Ejemplo:
//Wrap.vue
	<template>
	  <div class="wrap">
	    <h1>wrap</h1>
	    <slot :data="value"> 
	     这是slot标签内容备用内容{
    
    {
    
    value}}
	    </slot>
	    <slot name="list" :data="list" />
	    <hr />
	  </div>
	</template>
	<script>
	export default {
    
    
	  data() {
    
    
	    return {
    
    
	      value: "wrap-value",
	      list:[1,2,3,4]
	    };
	  },
	};
</script>
//App.vue
	<template>
	  <div id="app">
	    app
	    <Wrap>
	      <template v-slot:defalut="{ data }">
	        <Box :title="data" />
	      </template>
	      <template v-slot:list="{ data }">
	        <ul>
	          <li v-for="(item, index) in data" :key="index">
	            {
    
    {
    
     item }}
	          </li>
	        </ul>
	      </template>
	    </Wrap>
	  </div>
	</template>
	<script>
	import Wrap from "./components/Wrap";
	import Box from "./components/Box";
	export default {
    
    
	  components: {
    
    
	    Wrap,
	    Box,
	  }
	};
	</script>

correr:
Inserte la descripción de la imagen aquí

5. $ padre, $ hijos

  1. $ parent obtiene la instancia del componente principal (puede usar esto. $ parent directamente en el componente secundario)
  2. $ children obtiene la instancia del componente secundario (puede usar this. $ children directamente en el componente principal)
  3. También puede obtener los datos en el componente y modificar los datos
//App.vue
<template>
  <div id="app">
    app
    <Wrap ref="wrap">
      <Box />
      <h1>test</h1>
      <Foo />
    </Wrap>
  </div>
</template>
<script>
import Wrap from "./components/Wrap";
import Box from "./components/Box";
import Foo from './components/Foo'
export default {
    
    
  components: {
    
    
    Wrap,
    Box,
    Foo
  }
};
</script>

Wrap.vue

<template>
  <div class="wrap" :style="{ background: bgColor }">
    <h1>wrap value: {
    
    {
    
     value }}</h1>
    <slot />
  </div>
</template>
<script>
export default {
    
    
  data() {
    
    
    return {
    
    
      value: "hello",
      bgColor: "green",
    };
  },
  methods: {
    
    
    setBgColor() {
    
    
      this.bgColor = "#ddd";
    },
  },
  mounted() {
    
    
    console.log(this.$children);
  },
};
</script>

<style>
.wrap {
    
    
  padding: 40px;
  background: red;
}
</style>

Box.vue

<template>
  <div class="box">
    <h2>box</h2>
    <button @click="modifyAction">按钮</button>
  </div>
</template>
<script>
export default {
    
    
  mounted(){
    
    
    console.log(this.$parent);
  },
  methods: {
    
    
    modifyAction(){
    
    
      console.log(this.$parent.value) //获取父组件的数据
      console.log(this.$parent.bgColor)
      this.$parent.value = 'hi!'
      console.log(this.$parent.value)
      this.$parent.setBgColor();
      console.log(this.$parent.bgColor);

    }
  }
}
</script>
<style>
.box{
    
    
  background: yellow;
}
</style>

El código es el siguiente (ejemplo):
Inserte la descripción de la imagen aquí
Haga clic en
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

6. Componentes recursivos

Ver aplicación

<template>
  <div id="app">
    app
    <demo :value="5" />
  </div>
</template>
<script>
import Demo from "./components/Demo";

export default {
    
    
  components: {
    
    
    [Demo.name]: Demo,
  },
};
</script>

Demo.vue
puede llamar al componente en sí en la plantilla dentro del componente solo después de que el nombre del componente se establezca aquí

<template>
  <div class="demo" :style="{background:`rgb(${r},${g},${b})`}">
      <button v-if="value>1" @click="showAction">按钮</button>
      <demo v-if="isShow && value>1"  :value="value-1" />
  </div>
</template>

<script>
export default {
    
    
    //只有在这里设置了组件的名字后,才能在组件内部的template中调用组件自身    
    name:'demo',
    props:{
    
    
        value:Number,
    },
    data(){
    
    
        return{
    
    
            r:Math.random()*255,
            g:Math.random()*255,
            b:Math.random()*255,
            isShow:false,
        }
    },
    methods:{
    
    
        showAction(){
    
    
            this.isShow=!this.isShow;
        }
    }
}
</script>

<style>
.demo{
    
    
  padding: 20px;
  border: 1px solid #ddd;
}
</style>

Tabla de efectos en ejecución:
Inserte la descripción de la imagen aquí


Supongo que te gusta

Origin blog.csdn.net/qq_46057900/article/details/109393404
Recomendado
Clasificación