Vue-渲染函数-插槽

先看个插槽的例子:

<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#使用插槽分发内容

原文地址:https://www.cnblogs.com/xianshenglu/p/8480151.html

时间: 2024-11-09 02:13:22

Vue-渲染函数-插槽的相关文章

vue 渲染函数&amp;jsx

前端更新状态,更新视图,所以性能问题主要由Dom操作引起的,而js解析编译dom渲染就要快得多,  所把要js和html混写. vue 的动态js操作 html  方法:reader函数: vue  虚拟dom原理  +jsx ========================= <h1>{{bigTitle }}</h1> 渲染函数: reader:function(createElement){ return createElement('h1',this.bigTitle);

Vue 渲染函数

Vue 推荐在绝大多数情况下使用模板来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力.这时你可以用渲染函数,它比模板更接近编译器. 一 项目结构 二 App组件 <template> <div id="app"> <fruit fruitName="Durian" :level="2"> very delicious! </fruit> </div&g

Vue躬行记(7)——渲染函数和JSX

除了可通过模板创建HTML之外,Vue还提供了渲染函数和JSX,前者的编码自由度很高,后者对于开发过React的人来说会很熟悉.注意,Vue的模板最终都会被编译成渲染函数. 一.渲染函数 虽然在大部分场景中,都会选择直观而清晰的模板,但遇到一些复杂的场景时,就不得不使用渲染函数render()了. 1)render() 假设有一个page组件,它会根据外部传入的type特性,有选择的渲染,其模板如下所示. <script type="text/x-template" id=&qu

Vue 之 slot(插槽)

前言: vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项在使用频率.使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生“算了吧,回头再学,反正已经可以写基础组件了”的想法,于是就关闭了vue的说明文档. 实际上,插槽的概念很简单,下面通过分三部分来讲.这三部分也是按照vue说明文档的顺序来写的. 进入这三部分之前,先让还没接触过插槽的同学对什么是插槽有一个简单的概念:插槽,也就是slot,是组件的一块HTML模板,这块模板

VUE调用函数,以及event的讲解

先看我们是如何定义函数的 var vm = new Vue({ //找到ID为APP的作用域 el: "#app", //数据 data: { msg: "Hello Vue", num: 0 }, //methods就是VUE中函数的定义处 methods: { //函数名称 函数体 handle: function (event) { //查看当前触发函数的内容 console.log(event.target.value); this.num++; }, ha

理解Vue中的Render渲染函数

VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数.比如如下我想要实现如下html: <div id="container"> <h1> <a href="#"> Hello world! </a> </h1> </div> 我们会如下使用: <!DOCTYPE html> <html

Render渲染函数和JSX

1.Render函数 官网API地址:https://cn.vuejs.org/v2/guide/render-function.html 通常写的h为createElement的缩写,createElement 会返回虚拟节点 (virtual node)”,也常简写它为“VNode,因为它所包含的信息会告诉 Vue 页面上需要渲染什么样的节点,包括及其子节点的描述信息. 第一个参数为一个 HTML 标签名.组件选项对象,为必选项. 第二个参数为 {Object},是一个与模板中属性对应的数据

vue渲染数据后与owlCarousel轮播插件冲突,失效

主要原因:dom解析准备完成后,开始执行$(document).ready(); 而vue是在window.onload(页面加载完后才执行):所以会导致owlCarousel插件失效. 解决方案:数据渲染后,更新dom:再调用插件.(vue的 this.$nextTick可以更新dom) 1.引入owlCarousel插件,vue,jq (function ($) { new Vue({ el: '#owl-demo1', data:{ aboutData:[], getRouteUrl: '

vue render函数 函数组件化

之前创建的锚点标题组件是比较简单,没有管理或者监听任何传递给他的状态,也没有生命周期方法,它只是一个接受参数的函数 在这个例子中,我们标记组件为functional,这意味它是无状态(没有data),无实例(没有this上下文) 一个函数化组件就像这样: Vue.component('my-component', { functional: true, // 为了弥补缺少的实例 // 提供第二个参数作为上下文 render: function (createElement, context) {