render note

本文探讨Vue.js中的render函数,它作为字符串模板的替代方案,允许利用JavaScript的全部编程能力。render函数接收createElement方法,用于创建VNode。文章详细介绍了如何通过render方法生成模板,包括使用createElement方法的三个参数,以及JSX语法的应用。同时,解释了如何在render函数中创建和使用组件,强调了正确创建组件标签以确保它们能被组件识别的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

render

  • 类型(createElement: () => VNode) => VNode

  • 详细

    字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力。该渲染函数接收一个 createElement 方法作为第一个参数用来创建 VNode

    如果组件是一个函数组件,渲染函数还会接收一个额外的 context 参数,为没有实例的函数组件提供上下文信息。

    Vue 选项中的 render 函数若存在,则 Vue 构造函数不会从 template 选项或通过 el 选项指定的挂载元素中提取出的 HTML 模板编译渲染函数。

1. render方法的实质就是生成template模板; 
2. 通过调用一个方法来生成,而这个方法是通过render方法的参数传递给它的; 
3. 这个方法有三个参数,分别提供标签名(组件)标签相关属性标签内部的html内容 
4. 通过这三个参数,可以生成一个完整的模板 

备注:

  1. render方法可以使用JSX语法,但需要Babel plugin插件;
  2. render方法里的第三个参数可以使用函数来生成多个组件(特别是如果他们相同的话),只要生成结果是一个数组,且数组元素都是VNode即可;

<div id="app">
    <child v-bind:level="2">Hello world!</child>
</div>
 
<script type="text/javascript">
 
Vue.component('child', {
    render: function (createElement) {
        return createElement(
            'h' + this.level, // tag name 标签名称
            this.$slots.default // 子组件中的阵列
        )
    },
    props: {
        level: {
            type: Number,
            required: true
        }
    }
})
 
new Vue({
    el: "#app"
})
 
</script>
  1. 这里的代码和上面区别之处有两点: 
    其一,没有显式的模板内容,而是通过render方法生成; 
    其二,使用了createElement方法。
  2. 关于createElement方法,他是通过render函数的参数传递进来的,这个方法有三个参数: 
    第一个参数主要用于提供dom的html内容,类型可以是字符串、对象或函数。比如”div”就是创建一个 <div>标签 
    第二个参数(类型是对象)主要用于设置这个dom的一些样式、属性、传的组件的参数、绑定事件之类,具体可以参考 官方文档 里这一小节的说明 
    第三个参数(类型是数组,数组元素类型是VNode)主要用于说是该结点下有其他结点的话,就放在这里。

        比如说,有需要分发的标签 <slot>,则通过 this.$slots.default 来获得,或许还有其他组件之类,可能需要被使用的,应该也是放在这里。 


        个人初步理解是,在原本被替换的地方,例如例上面代码中的 <child> 标签,在其下的每个次一级标签为一个元素,放在 this.$slots.default这个数组中,例如上面的话,这个数组只有一个元素,但是以下代码: 

<child v-bind:level="2"><div>Hello</div><div> world!</div></child> 

        这个数组中则有两个元素,分别是 <div>Hello</div> 和 <div> world!</div>例如 this.$slots.default[0] 则表示第一个标签。

        另外,假如这2个元素中间有空格、换行符之类,那么数组中则有三个元素,那个空格、换行符则为第二个元素。这个属性有点类似dom的 childNodes属性,不是单纯以标签才算作子节点的。(但注意,不是完全相同)

        有时候,我们可能想在里面添加其他的组件,例如将abc组件注册在里面。那么,我们首先要注册这个abc组件,然后将abc组件在数组里通过createElement来创建标签,只有通过这样的方式创建的abc标签,才能被abc组件使用。单纯输入字符串"<abc></abc>" 这样是不可以的。

此时会渲染一个h1标签,innerHTML是你好:

render(createElement){
    //console.log(typeof createElement)//function
    return createElement('h1','你好')
}

第三个参数,该组件的内容,可以是子节点:

<script>
export default {
  props: {tag:String},
  data() {
    return {
      people: ["tom", "jack", "aric"],
    };
  },
  render(createElement) {
    return createElement(
      this.tag,
      {},
      this.people.map((name) =>
        createElement(
          "li",
          {
            attrs: { class: "test" },
            on: {
              click: () => {
                console.log(123);
              },
            },
          },
          `${name}`
        )
      )
    );
  },
};
</script>

<style lang="">
</style>

el-row:

export default {
  name: 'ElRow',

  componentName: 'ElRow',

  props: {
    tag: {
      type: String,
      default: 'div'
    },
    gutter: Number,
    type: String,
    justify: {
      type: String,
      default: 'start'
    },
    align: String
  },

  computed: {
    style() {
      const ret = {};

      if (this.gutter) {
        ret.marginLeft = `-${this.gutter / 2}px`;
        ret.marginRight = ret.marginLeft;
      }

      return ret;
    }
  },

  render(h) {
    return h(this.tag, {
      class: [
        'el-row',
        this.justify !== 'start' ? `is-justify-${this.justify}` : '',
        this.align ? `is-align-${this.align}` : '',
        { 'el-row--flex': this.type === 'flex' }
      ],
      style: this.style
    }, this.$slots.default);
  }
};

### 记录Express框架笔记的方法 #### 关于Express的关键特性 Express是一个简洁而灵活的Node.js Web应用框架,提供了一系列强大的功能来开发Web和移动应用程序[^1]。 #### 使用Express创建基本服务器 为了理解如何使用Express构建基础架构,可以考虑如下简单的例子: ```javascript const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); }); ``` 这段代码展示了最简单的方式启动一个HTTP服务器并监听特定端口上的请求。通过定义路由处理函数,可以根据不同的URL路径返回相应的内容给客户端。 #### 中间件机制 中间件是位于请求和响应之间的函数,在此期间它可以执行任何代码逻辑、修改对象或者结束请求-响应周期。例如日志记录、解析JSON数据等操作都可以作为中间件实现。下面的例子演示了如何注册全局级别的中间件用于打印每次访问的日志信息: ```javascript app.use((req, res, next) => { console.log(`${new Date().toISOString()} ${req.method} ${req.url}`); next(); // 转移到下一个中间件或路由处理器 }); ``` #### 模板引擎支持 借助模板引擎可以让开发者更方便地生成HTML页面。Express内置对多种流行的视图渲染库的支持,比如Jade(Pug),EJS等等。设置默认使用的模板引擎只需要一行配置即可完成: ```javascript // 设置pug为模板引擎 app.set('view engine', 'pug'); // 渲染index.pug文件并向其传递变量data res.render('index', { data }); ``` #### RESTful API设计模式下的资源管理 REST是一种软件架构风格,它规定了一组约束条件和原则。当这些指导方针应用于网络服务的设计时,则称为RESTful web services。遵循这种模式有助于提高系统的可扩展性和互操作性。利用Express提供的强大路由能力很容易就能搭建起符合REST标准的服务接口[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值