Vue 测试版本:Vue.js v2.5.13

先看个插槽的例子:

<div id="app">
<child >
<span slot-scope="props">
{{props.text}}
</span>
</child>
</div>
window.onload = function() {
Vue.component('child', {
template: `
<div>
<slot text="hello from child"></slot>
</div>
`,
}); new Vue({
el: '#app'
});
};

最终效果:

应该比较好理解,如果换成渲染函数,js 就是这样:

window.onload = function() {
Vue.component('child', {
render(createElement){
let vnodes1 = this.$scopedSlots.default({
text: 'hello from child'
});
return createElement('div',[vnodes1]);
}
}); new Vue({
el: '#app'
});
};

前后比较对照下,结合文档,应该能看懂;

但是插槽有很多种形式,具名与否,作用域与否等等,综合在一起,做了个 demo,代码如下:

    <div id="app">
<myele>
<div>
default slot
</div>
<div slot="header">
header
</div>
<div slot-scope="props" slot="footer">
<div>footer from parent!</div>
<div>{{props.text}}</div>
</div>
</myele>
<child>
<span slot-scope="props">
{{props.text}}
</span>
</child>
</div>

如果依旧用 template ,js 就是这样:

window.onload = function() {
Vue.component('myele', {
template: `
<div>
<div>vnodes0</div>
<slot></slot>
<slot name="header"></slot>
<slot name="footer" text="footer child value"></slot>
<child>
<span slot-scope="props">{{props.text}}</span>
</child>
</div>
`
}); Vue.component('child', {
render(createElement) {
let vnodes1 = this.$scopedSlots.default({
text: 'hello from child'
});
return createElement('div', [vnodes1]);
}
}); new Vue({
el: '#app'
});
};

效果图:

如果用渲染函数实现,就是这样:

window.onload = function() {
Vue.component('myele', {
render(createElement) {
let vnodes0 = createElement('div', 'vnodes0'),
vnodes1 = this.$slots.default,
vnodes2 = this.$slots.header,
vnodes3 = this.$scopedSlots.footer({
text: 'footer child value'
}),
vnodes4 = createElement('child', {
scopedSlots: {
default: function(props) {
return createElement('span', props.text);
}
}
});
return createElement('div', [vnodes0, vnodes1, vnodes2, vnodes3, vnodes4]);
}
}); Vue.component('child', {
render(createElement) {
let vnodes1 = this.$scopedSlots.default({
text: 'hello from child'
});
return createElement('div', [vnodes1]);
}
}); new Vue({
el: '#app'
});
};

两边一对照,结合文档,应该就比较清楚了

参考文档:

https://cn.vuejs.org/v2/guide/render-function.html#插槽

https://cn.vuejs.org/v2/guide/components.html#使用插槽分发内容

Vue基础-渲染函数-插槽的更多相关文章

  1. Vue基础-渲染函数-父子组件-传递数据

    Vue 测试版本:Vue.js v2.5.13 做了个 demo,把父子组件的数据都绑定到 Vue 实例 app 上,注释中的 template 相对好理解些 <div id="app ...

  2. vue render 渲染函数

    vue render 渲染函数 经常看到使用render渲染函数的示例,而且在一些特殊情况下,确实更好使用,可以更加有效地细分组件,因而借助vue-element-admin来学习一波 render函 ...

  3. Vue.js 渲染函数, JSX(未掌握,未学完)

    渲染函数 , JSX(没完成学习) 基础: 实例属性:vm.$slots default 属性包括了所有没有被包含在具名插槽中的节点. 渲染函数: render: function(createEle ...

  4. Vue基础篇之 插槽 slot

  5. Render渲染函数和JSX

    1.Render函数:render是用来替换temlate的,需要更灵活的模板的写法的时候,用render. 官网API地址:https://cn.vuejs.org/v2/guide/render- ...

  6. 理解Vue中的Render渲染函数

    理解Vue中的Render渲染函数 VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数.比如如下我想要实现 ...

  7. 从虚拟dom了解vue渲染函数

    vue渲染函数就是render函数,他会返回一个VNode,VNode是一个js对象,是dom的映射 vue在介绍渲染函数那个章节看的不是很懂,所以想要彻底的理解渲染函数,首先需要了解vue的虚拟do ...

  8. vue从入门到进阶:渲染函数 & JSX(八)

    Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接 ...

  9. Vue渲染函数

    前面的话 Vue 推荐在绝大多数情况下使用 template 来创建HTML.然而在一些场景中,真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更 ...

随机推荐

  1. spring in action 7.1 小结

    0 AbstractAnnotationConfigDispatcherServletInitializer剖析,在Servlet 3.0环境中,容器会在类路径中查找实现ServletContaine ...

  2. 使用ClipboardManager碰到Can&#39;t create handler inside thread that has not called Looper.prepare()

    直接放上我的代码.希望能给碰到相同问题的朋友提供帮助 Runnable runnable = new Runnable() { public void run() { ClipboardManager ...

  3. Lambda编写斐波那契数列

    还需要考虑溢出等问题,闲来无事写了写 Func<float, float, float> a = (arg1, arg2) => 0f;//init ; a = (lastNumbe ...

  4. Atitit. 解释器模式框架选型 and应用场景attilax总结 oao

    Atitit. 解释器模式框架选型 and应用场景attilax总结 oao 1. 解释器模式结构描述 1 2. 如何实现(简单的解释器模式,仅仅通过词法分析即可实现,而无需token流进行处理. 2 ...

  5. Java并发之彻底搞懂偏向锁升级为轻量级锁

    网上有许多讲偏向锁,轻量级锁的文章,但对偏向锁如何升级讲的不够明白,有些文章还相互矛盾,经过对jvm源码(biasedLocking.cpp)的仔细分析和追踪,基本升级过程有了一个清晰的过程,现将升级 ...

  6. 开启Visual Studio 2013时,出现Microsoft.VisualStudio.Web.PasteJson.JsonPackage无法载入的可能解決方案

    1.先下载:http://www.jb51.net/dll/Microsoft.VisualStudio.Web.PasteJson.dll.html Microsoft.VisualStudio.W ...

  7. 16V554 的测试代码

    //------------------------------------------------------------------------ #include   "AT16C554 ...

  8. oozie调度中的重试和手工rerun一个workflow

    在oozie中有Bundle.Coordinator和Workflow三种类型的job,他们之间可以有以下包含关系. Bundle > Coordinator > Workflow. 1. ...

  9. 如何解决PHP里大量数据循环时内存耗尽的问题

    最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...

  10. centos6.5 系统上升级2.6.6到2.7.12

    因开发需要,今天把CentOS 6.4自带的Python2.6.6升级到了Python2.7.3.按照如下步骤进行升级 1.查看当前系统python的版本 python -V 2.下载2.7.3版本的 ...