美文网首页Vue.js
vue 2.6 插槽更新 v-slot 用法总结

vue 2.6 插槽更新 v-slot 用法总结

作者: Mando度 | 来源:发表于2019-03-09 12:27 被阅读2次

    在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍在文档中的特性。新语法的由来可查阅 RFC。

    引vue官方文档
    之前做项目时,对插槽理解太少了,这两天学习时,才发现插槽更新用v-slot了,自己做了些简单总结,与大家分享一下~

    插槽

    我的理解就是
    父页面在组件标签内插入任意内容,子组件内插糟slot控制摆放位置
    (匿名插槽,具名插槽)

    插槽分类

    插槽一共就三大类
    1.匿名插槽(也叫默认插槽): 没有命名,有且只有一个
    2.具名插槽: 相对匿名插槽组件slot标签带name命名的
    3.作用域插槽: 子组件内数据可以被父页面拿到(解决了数据只能从父页面传递给子组件)

    匿名插槽(也叫默认插槽default)

    用法:我的理解,匿名插糟只需要一个.(就是这些,不太复杂)
    父页面:

     <todo-list> 
            <template v-slot:default>
                  任意内容
                 <p>我是匿名插槽 </p>
            </template>
    </todo-list>    
    //v-slot:default写上感觉和具名写法比较统一,容易理解,也可以不用写
    

    子组件 todoList.vue

    <slot>我是默认值</slot>
    
    ##显示##
    // 任意内容
    // 我是匿名插槽
    

    具名插槽(name)

    用法:我的理解,和匿名插槽比较,就是必须起名todo对应,可以有多个具名插槽.(没了~)
    父页面

     <todo-list> 
            <template v-slot:todo>
                  任意内容
                 <p>我是匿名插槽 </p>
            </template>
    </todo-list>  
    // todo
    data() {
         return {
           dynamicSlotName:"todo"  
         }
    
     },
    

    子组件

    <slot name="todo">我是默认值</slot>
    
    ##显示##
    // 任意内容
    // 我是匿名插槽
    

    对 v-slot:todo 做操作:

    动态命名

    v-slot:{dynamicSlotName}//替换标签上 v-slot:todo
    

    具名插槽缩写(匿名插槽用法)(可以后看)

    #todo 替换标签上 v-slot:todo
    

    匿名如果想用必须加上default

    #default 替换标签上 v-slot:todo
    

    父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

    作用域插槽

    1.重点是slotProps接取子组件里:user="user" :test="test"类似属性的数据
    父页面

    <todo-list>
      <template v-slot:todo="slotProps" >
          {{slotProps.user.firstName}}
      </template> 
    </todo-list> 
    //slotProps 可以随意命名
    //slotProps 接取的是子组件标签slot上属性数据的集合所有v-bind:user="user"
    

    子组件

     <slot name="todo" :user="user" :test="test">
            {{ user.lastName }}
      </slot> 
    data() {
            return {
                user:{
                    lastName:"Zhang",
                    firstName:"yue"
                },
                test:[1,2,3,4]
            }
        },
    // {{ user.lastName }}是默认数据   v-slot:todo 当父页面没有(="slotProps")
    // 时显示 Zhang
    
    
    ## 显示 ##
    // yue
    

    解构插槽Prop

    父页面 (子组件不变 显示一样)

    // 相当于
    function (slotProps) {
      // 插槽内容
    }
    (slotProps)=>参数可以用slot标签上现有的值({user,test})替换
    
    <todo-list>
      <template v-slot:todo="{user,test}
    " >
          {{user.firstName}}
      </template> 
    </todo-list> 
    ## 显示 ##
    ## // yue
    

    参数值替换名字(可以后看)

    <todo-list>
      <template  v-slot:todo="{user:person,test}
    " >
          {{person.firstName}}
      </template> 
    </todo-list> 
    
    // v-slot:[dynamicSlotName]="{user:person,test}
    ## 显示 ##
    ## // yue
    

    独占默认插槽缩写(可以后看)
    感觉没什么机会用,限制条件太多

    总结

    在用上v-slot之后 只需要考虑好
    1.是否需要命名(匿名插槽,具名插槽)
    2.父页面是否需要取存在子页面的数据(作用域插槽)

    todo-list实例

    可以试一下,便于理解~
    父页面

    <template>
        <div>
            新插槽 v-slot 代替具名插槽 作用于插槽
            <todo-list
            > 
            <template #todo="{todos:list}">
                <div @click = type(todos.id)>
                     {{list.text}}
                </div>
                   
            </template>
            </todo-list>    
        </div >
    </template>
    <script>
    import todoList from "@/components/component/slotTodoChildren";
    export default {
     name:"vSlot",
     components:{
        todoList
     },
     data() {
         return {
    
         }
     },
     methods: {
         type(data){
            console.log(data)
         }
     },
    }
    </script> 
    

    子组件

    <template>
        <ul class="slotTodoChildren">
            <li class="lis"
                v-for="todo in todoList"
                v-bind:key="todo.id"
            >
                <!--
                我们为每个 todo 准备了一个插槽,
                将 `todo(todoList里的)` 对象作为一个插槽的 prop 传入。
                -->
                <slot name="todo" :todos="todo">
                <!-- 后备内容 -->
                {{ todo.text }}
                </slot>
            </li>
        </ul>
    </template>
    <script>
    export default {
        name:"slotChildren",
    
        data() {
            return {
                todoList:[
                {
                    id:1,            
                    text:"扫地"
                },
                {
                    id:2,
                    text:"做饭"
                },
                {
                    id:3,
                    text:"擦桌子"
                }
            ]
            }
        },
        created(){
            console.log(this.filteredTodos)
        }
    }
    </script>
    <style  scoped>
    .slotTodoChildren .lis{
        display: block;
        background: #434534;
        line-height:40px;
        margin-top: 10px;
        color: #fff;
        font-size: 24px;
        height: 40px;
    }
    </style>
    

    相关文章

      网友评论

        本文标题:vue 2.6 插槽更新 v-slot 用法总结

        本文链接:https://www.haomeiwen.com/subject/omjspqtx.html