render函数的妙用

简介: render函数的妙用

1.render函数初步了解

template下只允许有一个子节点

<template id="hdom">
  <div>
    <h1 v-if="level==1">
    <slot></slot>
    </h1>
    <h2 v-if="level==2">
    <slot></slot>
    </h2>
    <h3 v-if="level==3">
    <slot></slot>
    </h3>
  </div>
</template>
//使用vue组件定义
// Vue.component('child',{
// props:['level'],
// template:'#hdom'
// })
//使用render函数进行定义组件
Vue.component('child',{
  render:function (createElement) {
  return createElement('h'+this.level,
  this.$slots.default);
  },
  props:['level']
  })

2.render函数的第一个参数

在render函数的方法中,

参数必须是createElement,createElement的类型是ifunction render

函数的第一个参数可以是 String | Object | Function

Vue.component("child", {
  // ----第一个参数必选
  //String--html标签
  //Object---一个含有数据选项的对象
  //FUnction---方法返回含有数据选项的对象
  render: function (createElement) {
    alert(typeof createElement);
    // return createElement('h1')
    // return createElement({
    // template:'<div>锄禾日当午</div>'
    // })
    var domFun = function () {
      return {
        template: "<div>锄禾日当午</div>"
      };
    };
    return createElement(domFun());
  }
});

3.render函数的第二个参数

Vue.component("child", {
  // ----第二个参数可选,第二个参数是数据对象----只能是Object
  render: function (createElement) {
    return createElement(
      {
        template: "<div>我是龙的传人</div>"
      },
      {
        class: {
          foo: true,
          baz: false
        },
        style: {
          color: "red",
          fontSize: "16px"
        },
        //正常的html特性
        attrs: {
          id: "foo",
          src: "http://baidu.com"
        },
        //用来写原生的Dom属性
        domProps: {
          innerHTML: '<span style="color:blue;font-size: 18px">我是蓝色</span>'
        }
      }
    );
  }
});

4.render函数的第三个参数

第三个参数也是可选===String | Array—作为我们构建函数的子节点来使用 的

Vue.component("child", {
  // ----第三个参数是可选的,可以是 String | Array---代表子节点
  render: function (createElement) {
    return createElement("div", [
      createElement("h1", "我是h1标题"),
      createElement("h6", "我是h6标题")
    ]);
  }
});

5.this.$slots在render函数中的应用

第三个 参数存的就是VNODE

createElement(‘header’,header), 返回的就是VNODE

let header = this.$slots.header; //–这返回的内容就是含有=VNODE的数组

Vue.component("my-component", {
  render: function (createElement) {
    debugger;
    var header = this.$slots.header; //--这返回的内容就是含有=V
    NODE的数组;
    var main = this.$slots.default;
    var footer = this.$slots.footer;
    return createElement("div", [
      createElement("header", header),
      createElement("main", main),
      createElement("footer", footer)
    ]);
  }
});

6.在render函数中使用props传递数据

<div id="app" >
  <button @click="switchShow">点击切换图片</button>
  {{show}}
  <my-component :show="show">
  </my-component>
</div>
Vue.component("my-component", {
  props: ["show"],
  render: function (createElement) {
    var imgsrc;
    if (this.show) {
      imgsrc = "img/001.jpg";
    } else {
      imgsrc = "img/002.jpg";
    }
    return createElement("img", {
      attrs: {
        src: imgsrc
      },
      style: {
        width: "600px",
        height: "400px"
      }
    });
  }
});

7.v­-model在render函数中的使用

<template>
  <div id="app">
    <!--<my-component :name="name" @input="showName"></my-componen
t>-->
    <my-component :name="name" v-model="name"></my-component>
    <br />
    {{ name }}
  </div>
</template>
Vue.component("my-component", {
  render: function (createElement) {
    var self = this; //指的就是当前的VUE实例
    return createElement("input", {
      domProps: {
        value: self.name
      },
      on: {
        input: function (event) {
          debugger;
          var a = this;
          //此处的this指的是什么?指的就是window
          self.$emit("input", event.target.value);
        }
      }
    });
  },
  props: ["name"]
});

8.作用域插槽在render函数中的使用

Vue.component("my-component", {
  render: function (createElement) {
    return createElement(
      "div",
      this.$scopedSlots.default({
        text: "我是子组件传递过来的数据",
        msg: "scopetext"
      })
    );
  }
});



目录
相关文章
|
2月前
快速掌握 Svelte 的 Render 函数
【10月更文挑战第4天】
37 0
|
7月前
|
JavaScript 前端开发
在JavaScript中,函数原型(Function Prototype)是一个特殊的对象
【5月更文挑战第11天】JavaScript中的函数原型是一个特殊对象,它为所有函数实例提供共享的方法和属性。每个函数在创建时都有一个`prototype`属性,指向原型对象。利用原型,我们可以向所有实例添加方法和属性,实现继承。例如,我们定义一个`Person`函数,向其原型添加`greet`方法,然后创建实例`john`和`jane`,它们都能调用这个方法。尽管可以直接在原型上添加方法,但推荐在构造函数内部定义以封装数据和逻辑。
67 2
|
JavaScript
js动态绑定事件,无法使用for循环中变量i的问题
js动态绑定事件,无法使用for循环中变量i的问题
|
JavaScript 前端开发 UED
js事件的作用和用法
js事件的作用和用法
115 0
|
C语言 C++
关于const的用法简单举列子介绍
关于const的用法简单举列子介绍
96 0
关于const的用法简单举列子介绍
|
前端开发 算法 JavaScript
在React的render方法中使用箭头函数
在React的render方法中使用箭头函数
156 0
|
JavaScript
vue再读46-计算属性和methods的区别
vue再读46-计算属性和methods的区别
81 0
vue再读46-计算属性和methods的区别
|
JavaScript 开发者
HackerNews03-封装 render 函数|学习笔记
快速学习 HackerNews03-封装 render 函数
|
前端开发
尤大亲自解释vue3源码中为什么不使用?.可选链式操作符🐣
尤大亲自解释vue3源码中为什么不使用?.可选链式操作符🐣
881 0
尤大亲自解释vue3源码中为什么不使用?.可选链式操作符🐣