vue 插槽scope_Vue插槽原理与用法详解

本文实例讲述了Vue插槽原理与用法。分享给大家供大家参考,具体如下:

1 插槽内容

Vue 实现了一套内容分发的 API,这套 API 基于当前的 Web Components 规范草案,将 元素作为承载分发内容的出口。

它允许你像这样合成组件:

Your Profile

然后你在 的模板中可能会写为:

Vue.component('navigation-link', {

template: `

v-bind:href="url" rel="external nofollow"

class="nav-link"

>

`

});

当组件渲染的时候,这个 元素将会被替换为“Your Profile”。

1551756572C155iE175657j2.png

插槽内可以包含任何模板代码,包括 HTML:

Your Profile

甚至其它的组件:

Your Profile

如果 没有包含一个 元素,则任何传入它的内容都会被抛弃。

2 具名插槽

有些时候我们需要多个插槽。例如,一个假设的 组件多模板如下:

对于这样的情况, 元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽:

在向具名插槽提供内容的时候,我们可以在一个父组件的 元素上使用 slot特性:

Here might be a page title

A paragraph for the main content.

And another one.

Here's some contact info

另一种 slot 特性的用法是直接用在一个普通的元素上:

Here might be a page title

A paragraph for the main content.

And another one.

Here's some contact info

我们还是可以保留一个未命名插槽,这个插槽是默认插槽,也就是说它会作为所有未匹配到插槽的内容的统一出口。上述两个示例渲染出来的 HTML 都将会是:

Here might be a page title

A paragraph for the main content.

And another one.

Here's some contact info

3 默认插槽的内容

有的时候为插槽提供默认的内容是很有用的。例如,一个 组件可能希望这个按钮的默认内容是“Submit”,但是同时允许用户覆写为“Save”、“Upload”或别的内容。

你可以在 标签内部指定默认的内容来做到这一点。

Submit

如果父组件为这个插槽提供了内容,则默认的内容会被替换掉。

4 编译作用域

当你想在插槽内使用数据时,例如:

Logged in as {{ user.name }}

该插槽可以访问跟这个模板的其它地方相同的实例属性 (也就是说“作用域”是相同的)。但这个插槽不能访问 的作用域。例如尝试访问 url 是不会工作的。牢记一条准则:

父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。

5 作用域插槽

2.1.0+ 新增

有的时候你希望提供的组件带有一个可从子组件获取数据的可复用的插槽。例如一个简单的 组件的模板可能包含了如下代码:

Vue.component('todo-list',{

template:`

  • v-for="todo in todos"

    v-bind:key="todo.id">

    {{ todo.text }}

`

});

但是在我们应用的某些部分,我们希望每个独立的待办项渲染出和 todo.text 不太一样的东西。这也是作用域插槽的用武之地。

为了让这个特性成为可能,你需要做的全部事情就是将待办项内容包裹在一个 元素上,然后将所有和其上下文相关的数据传递给这个插槽:在这个例子中,这个数据是 todo 对象:

  • v-for="todo in todos"

    v-bind:key="todo.id"

    >

    {{ todo.text }}

现在当我们使用 组件的时候,我们可以选择为待办项定义一个不一样的 作为替代方案,并且可以通过 slot-scope特性从子组件获取数据:

{{ slotProps.todo.text }}

在 2.5.0+,slot-scope 不再限制在 元素上使用,而可以用在插槽内的任何元素或组件上。

解构 slot-scope

如果一个 JavaScript 表达式在一个函数定义的参数位置有效,那么这个表达式实际上就可以被 slot-scope接受。也就是说你可以在支持的环境下 单文件组件或现代浏览器),在这些表达式中使用 ES2015 解构语法。例如:

{{ todo.text }}

这会使作用域插槽变得更干净一些。

希望本文所述对大家vue.js程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值