相关文章推荐
帅呆的电脑桌  ·  Power Apps ...·  6 月前    · 
侠义非凡的闹钟  ·  SAS岩论 | ...·  1 年前    · 
幸福的领带  ·  mysql ...·  1 年前    · 
绅士的镜子  ·  微软开源DeepSpeed ...·  1 年前    · 

render 函数需要你将模板定义为 JavaScript 对象,即用js来构建DOM

  1. 通过js对象模型所表达的html结构转换成AST(抽象语法树)用于构建虚拟节点VNode
  2. render函数再在这个虚拟节点上渲染数据,完成数据渲染后就添加到html文档中渲染到页面
  1. 使模板更接近编译器,并允许你使用完整的 JavaScript 功能,而不是指令提供的子集
  1. 优先级:render> template > el
  2. 所以Vue 选项中的 render 函数若存在,则 Vue 构造函数不会从 template 选项或通过 el 选项指定的挂载元素中提取出的 HTML 模板编译渲染函数

createElement 参数

Vue中的Render函数中有一个参数,这个参数是一个函数通常我们叫做createElement。Render函数将createElement的返回值放到了HTML中;createElement这个函数中有3个参数:

  1. 第一个参数可以是HTML标签名,组件或者函数都可以(必须的)
  2. 第二个参数为数据对象
  3. 第三个参数为子节点(字符串或数组)
    在这里插入图片描述

参考官网:( https://cn.vuejs.org/v2/guide/render-function.html#createElement-%E5%8F%82%E6%95%B0 )

下面写几个例子:

1.事件的使用

//template use
<evn list="hahahah"></evn>
//contentTheTemplate
Vue.component('evn', {
            props: ['list'],
            render(h){
            //因为官方有写将 h 作为 createElement 的别名是 Vue 生态系统中的一个通用惯例,
            //实际上也是 JSX 所要求的
                let _this = this;
                return h('button', {
                    on:{
                    	//此处如果这样写,会导致页面渲染完直接触发
                    	//并不受click控制
                        // click:_this.alert(_this.list)
                        click: () => {_this.alert(_this.list)}
                }, [h('p', '大哥快点我呀')])
//a method is call    
     Vue.mixin({
         methods: {
             alert(res){
                 alert(res)

2.插槽的使用

	<c-list cti="[{'tit': '我在这'},{'tit': '不我在这儿'}]">
      <p>12312</p>
    </c-list>
	Vue.component('c-list',{
            props: ['cti'],
            render(h) {
            //使用map方法实现v-for效果
            //this.$slot 类型:{[name: string]: ?Array<VNode>}
            //this.$slots.default 为默认插槽
            //也可以定义具名插槽 this.$slots.名称 | 使用 v-slot:名称 插入
                return h('div',[this.cti.map(res=> h('div', res.tit)), this.$slots.default]
        //上式等于
        <div v-for="item in [{'tit': '我在这'},{'tit': '不我在这儿'}]">
        	<div>{{ item.tit }}</div>
        	<slot></slot>
		</div>

scopedSlots

scopedSlots主要用于子组件的作用域插槽

//接受子组件数据
      <div slot-scope="props">{{ props.text }}</div>
      <template slot="name1" scope="props">
        <span>{{props.text}}</span>
      </template>
    </ming>
	Vue.component('ming', {
            render(h){
            //this.$scopedSlots 类型{[name: string]: props => Array<VNode> | undefined}
            //组件向插槽内传递参数 {'text':'caomingrui'}
                return h('div', [this.$scopedSlots.default({
                    text: 'caomingrui'
                }),
                this.$scopedSlots.name1({
                        text:'hello scope'
	<rui></rui>
	//定义子组件
	Vue.component ("c-node", {
            render(h){
                return h('div', [
                	//定义向默认操作传值
                    // this.$scopedSlots.default({
                    //     text: '000000000000'
                    // }),
                    this.$scopedSlots.ddg({
                        text: 'caomingrui123'
        Vue.component('rui', {
            render(h){
                return h('div',[h('c-node', {
                //接受对应值
                    scopedSlots: {
                        default: props => h('span', props.text)
                }),
                h('c-node', {
                    scopedSlots: {
                        ddg: props => h('span', props.text)
                })])
                    render 函数入门基础createElement 参数使用 JavaScript 代替模板功能基础createElement 参数Vue中的Render函数中有一个参数,这个参数是一个函数通常我们叫做h。其实这个h叫做createElement。Render函数将createElement的返回值放到了HTML中createElement这个函数中有3个参数事例:createElement(‘div’, {} ,‘我是内容呦’)第二个参数(类型是对象,可选):用于设置这个DOM的一些样式、属
				
探索 vm.$slots 和 vm.$scopedSlots 以下例子是在Vue@2.6.2中运行的。 vm.$slots内包含当前组件实例中所有插槽(包括默认插槽、具名插槽、作用域插槽)。 &amp;amp;amp;lt;!-- App.vue --&amp;amp;amp;gt; &amp;amp;amp;lt;template&amp;amp;amp;gt; &amp;amp;amp;lt;div id=&amp;amp;quot;ap
render函数 vue通过 template 来创建你的 HTML。但是,在特殊情况下,这种写死的模式无法满足需求,必须需要js的编程能力。此时,需要用render来创建HTML。 什么情况下适合使用render函数 在一次封装一套通用按钮组件的工作中,按钮有四个样式(default success error )。首先,你可能会想到如下实现 <div v-if=type>success</div> <div v-else-if=type>error</div> <div v-else-if=type === 'war
一直对Vue中的slot插槽比较感兴趣,下面是自己的一些简单理解,希望可以帮助大家更好的理解slot插槽 下面结合一个例子,简单说明slots的工作原理 dx-li子组件的template如下: <li class=dx-li> </slot> dx-ul父组件的template如下: hello juejin! 结合上述例子以及vue中相关源码进行分析 dx-ul父组件中template编译后,生成的组件render函数: module.exports={ render:fu
4、在 render 函数中的使用 slots/slots/slots/scopedSlots 有了上面内容的铺垫,可以看到,不论是 $slots 还是 $scopedSlots ,它们的属性都是父组件向子组件注入的内容决定的,只不过 $scopedSlots可以再向父组件抛出数据 它们是在模板上编写 后 Vue 替你进行的下一步操作。 现在我们在 render 上自己执行它们 就第一个 slots 的例子来改,可以改为 <template> 我是子组件!
用来访问被插槽分发的的内容。每个具名插槽有其相应的属性。default属性包括了所有没有被包含在具名插槽中的节点或v-slot:default的内容 在使用渲染函数书写一个组件时,访问vm.slots最有帮助。 vm.$scopedSlots 类型:{[...
最近在写一个组件,在子组件中要获取到具名插槽的名字,然后再渲染出来,一开始用了slots但我一旦加上作用域,这个插槽就显示不出来了,后面通过一层一层的调试,终于发现原来是slots 但我一旦加上作用域,这个插槽就显示不出来了,后面通过一层一层的调试,终于发现原来是slots但我一旦加上作用域,这个插槽就显示不出来了,后面通过一层一层的调试,终于发现原来是slots搞的鬼,后来看了一下官方文档,发现slots和slots和slots和scopedSlots还是有区别的。 说的通俗一点就是scopedSlots
作用相同:都是作用域插槽 场景不同:slot-scope是模板语法,scopedSlots则是编程式语法 使用不同:在<template>中使用slot-scope,在render()函数使用scopedSlots Tips:欢迎留言补充~ 在渲染函数中如何使用? 假设我们有一个叫<base-layout>的组件,它的模板内容如下:
Vue实例属性vm.$datavm.$propsvm.$elvm.$optionsvm.$parentvm.$rootvm.$childrenvm.$slotsvm.$scopedSlotsvm.$refsvm.$isServervm.$attrsvm.$listeners vm.$data 类型:Object 详细:Vue 实例观察的数据对象。Vue 实例代理了对其 data 对象属性的访问。...
最近研究了vue的官方文档,到组件自定义渲染函数时,对第二个属性对象参数中的scopedSlots不太明白作用是什么,官网的案例也是一笔带过,于是连查带试算是明白了他的作用,这里记录一下,希望能帮到遇到相同问题的童鞋. 先说一下函数中的$slots吧,这个用起来很简单,直接获取到组件中对应的插槽虚拟节点.this.$slots.插槽名称. 废话少说,直接上代码: <div id="a...
1、Vue render Vue render是Vue在编译模板时的必经之路,通过 template 形式写出的模板最终会经由 render 函数渲染到dom上,正如 render 介绍所说的 然而在一些场景中,你真的需要 JavaScript 的完全编程的能力。这时你可以用渲染函数,它比模板更接近编译器 如果你还不了解 render 函数的作用以及能力,建议你现在官网了解一下 :) Vue官网 render函数介绍 2、slots 如果你还不了解 slot 的作用以及能力,建议你现在官网了解一下 :) &lt;div id="app"&gt; &lt;my-component&gt; &lt;h1 slot-scope="props"&gt;{{props.text}}&lt;/h1&gt; &lt;/my-component&gt; &lt;/div&gt; &lt;script&
renderslot 的一般默认使用方式如下: this.$slots.default 对用 template的<slot>的使用没有name 。 想使用多个slot 的话。需要对slot命名唯一。 在render函数中动态使用多个slot,并且给slot传值 一、我的业务逻辑: 使用了三个组件, 组件A调用组件B,组件B调用组件C,组件C是自己...