当前位置: 首页 > Web前端 > HTML

组件(4):使用槽进行内容分发

时间:2023-04-02 19:50:10 HTML

组件作用域(1)父组件模板的内容在父组件作用域内编译;子组件模板的内容是在子组件范围内编译的。父子组件相互独立编译,编译时只能使用各自作用域内的属性和方法。例如,您不能将指令绑定到父组件模板中子组件的属性或方法。如果这样做,控制台会报错,说属性没有定义。如果要绑定指令来控制子组件的行为,可以在子组件的模板中将指令绑定到子组件的属性或方法;或者将父组件模板中的指令绑定到父组件的属性或方法上。newVue({el:'#app-2',data:{makeChildShow:true},components:{"component-2-1":{template:'我是一个子组件。',data:function(){return{childIsShow:true}}},"component-2-2":{template:'我是一个子组件。',data:function(){return{childIsShow:true}}}}})

  • 绑定到子组件属性:
  • 绑定到父组件属性:
  • 将指令绑定到子组件模板中的子组件属性:
列表中的第一项,不会显示是因为父组件找不到属性childIsShow。内容分发默认将父组件的内容插入到子组件模板中的方式,我们称之为内容分发。默认情况下,子组件中插入的父组件的内容是不显示的。newVue({el:'#app-1',data:{message:'Icomefromparent.'},components:{"component-1":{template:'

我是一个子组件。

',}}}){{message}}
内容分发失败,消息未发送将被显示。单个socket如果想使用内容分发将父组件的内容插入到子组件的模板中,则必须在子组件的模板中标记一个alternatecontent,父组件会找到这个alternateContent标签,并用你自己的内容替换alternatecontent。如果父组件没有内容要分派,则回退内容成为最终呈现的结果。newVue({el:'#app-3',components:{"component-3":{template:'\'}}})
父组件标题
  • 父组件插入内容
  • 命名为套接字(multiplesockets)single-socket模式用于内容分发,插入到子模板中的内容只能插入到标记为的地方。content和slot上都标明了namedsocket,相应的内容只能分发到相应的slot中。使用slot="tag"标记内容;使用newVue({el:'#app-4',components:{"component-4":{template:'\
    \
    \\
    \
    \\
    \
    \\
    \
    \
    '}}})我会的形成头部

    我将插入所有未标记的槽

    我形成腿
    以上定义两个未命名的套接字。这里虽然显示正确,但是控制台报错,说重复定义的defaultsocketwillhaveunexpectederrorcomponentscope(2)根据Namedsocket,我们看一个组件作用域的例子newVue({el:'#app-7',方法:{parentMethod:function(){console.log("是父类的方法");}},components:{"component-7":{methods:{childMethod:function(){console.log("这是孩子的方法")}},template:"\"}}})内容分发①部分|内容分发部分②|内容分发部分属于父组件,所以点击按钮的内容分发部分会调用父组件方法并输出"Itistheparent'smethod”子组件模板定义属于子组件作用域,点击这部分,会调用子组件方法,输出“Itisthechild'smethod”socketscope在内容分发过程中,分发的内容由父组件可以按照子组件模板上定义的Attributes使用(即定义在socket作用域上的属性),例如,在分配内容上父组件,可以通过slot-scope="obj"获取套接字上定义的所有属性,并通过{{obj.slotval}}在slot-scope内部使用这些数据。特别是,使用slot-scopeinsocketscopelist上应用的socket不仅可以通过自身的属性向分布式内容传递数据,还可以在其上定义一个v-for指令,这样迭代的特性也可以传递给分布式内容。newVue({el:'#app-6',components:{"component-6":{data:function(){return{items:[{id:1,text:"EverywhereExpress"},{id:2,text:"龙虎山天师府"},{id:3,text:"药行社"}]}},template:'\'}}}){{id+","+text}}中的div>的内容分布被插入到槽中,由于槽中的v-for指令而被迭代。迭代后,通过slot-scope获取slot上的属性数据。内联模板当使用子组件的内联特性——inline-template时,父组件的内容分发部分被解释为子组件的模板,子组件的template属性也会被这部分替换(替换后模板失效),作用域也属于子组件。newVue({el:'#app-8',components:{'component-8':{template:'...'//全部替换data:function(){return{childMsg:'child的数据'}}}}})

    这些将作为组件本身的模板。

    而不是通过父组件传递内容。

    子组件数据:{{childMsg}}

    "child'sdata"由于其特性来自于子组件的childMsg,在使用内链接模板时,最常见的误解是混淆作用域。