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天】
39 0
|
4月前
|
JavaScript 前端开发
JS : 柯里化 分布传参给函数
JS : 柯里化 分布传参给函数
|
JavaScript 前端开发
JS(第七课)认识function函数(一)
JS(第七课)认识function函数(一)
89 0
|
7月前
|
自然语言处理 JavaScript 前端开发
JavaScript中箭头函数和普通函数的区别
JavaScript中箭头函数和普通函数的区别
|
7月前
|
JavaScript
原生js实现for循环占位符绑定数据,类似模拟vue循环渲染数据
原生js实现for循环占位符绑定数据,类似模拟vue循环渲染数据
|
前端开发
React基础语法04-循环数组渲染数据的方法
React基础语法04-循环数组渲染数据的方法
140 0
|
JavaScript
js动态绑定事件,无法使用for循环中变量i的问题
js动态绑定事件,无法使用for循环中变量i的问题
|
前端开发 JavaScript Go
script标签中async和defer的作用和区别?简述css盒模型?什么是闭包?
浏览器遇到script标签没有async和defer属性时,页面将会暂停解析来下载并执行script脚本,执行完毕继续解析页面(这样会阻塞页面,所以建议把script标签放在html底部)。
script标签中async和defer的作用和区别?简述css盒模型?什么是闭包?
|
人工智能 自然语言处理 JavaScript
$nextTick与原生js先渲染dom再执行函数的方式
$nextTick与原生js先渲染dom再执行函数的方式
153 0
|
JavaScript
JS(第七课)认识function函数(二)
JS(第七课)认识function函数(二)
81 0