【前端基础知识】最基础的render渲染函数知识,一看就会

是什么?

render 函数模板(template) 都是用来创建 html 模板的,Vue 推荐在绝大多数情况下使用模板(template)来创建你的 HTML。然而在一些场景中,你真的需要 JavaScript 的完全编程的能力。这时你可以用渲染函数,它比模板更接近编译器。

绝大多数情况下使用模板(template)来创建你的 HTML是这个样子的。

<!--HelloWorld.vue-->
<template>
  <div id="app">
    Hello World!!!
  </div>
</template>

render渲染函数是这个样子的。(修改HelloWorld.vue为render函数创建模板的形式)

<!--HelloWorld.vue-->
<script>
export default {
  //不用vue模板,使用render函数进行dom渲染,h->createElement
  //vue模板template最终也是要编译成render函数
  render(createElement){
    return createElement(
        //第一个参数:写一个 HTML 标签名、组件选项对象
        //或者resolve 了上述任何一种的一个 async 函数。必填项。
        'h1',
        //第二个参数:一个与模板中 attribute 对应的数据对象。
        //可选(具体参数见:https://cn.vuejs.org/v2/guide/render-function.html#%E6%B7%B1%E5%85%A5%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1)。
        {},
        //第三个参数:子级虚拟节点 (VNodes),由 `createElement()` 构建而成,
        //也可以使用字符串来生成“文本虚拟节点”。可选。
        "Hello World!!!"
    )
  }
  
};
</script>

效果都是一样的。vue模板template最终也是要编译成render函数

在这里插入图片描述

如何使用?

1. createElement的第一个参数

1.1 HTML 标签名(可以动态创建标签)

<!--HelloWorld.vue-->
<script>
export default {
  //传参
  props: {
    tag: {
      type: String,
      required: true,
    },
  },
  //不用vue模板,使用render函数进行dom渲染,h->createElement
  //vue模板template最终也是要编译成render函数
  render(createElement) {
    return createElement(this.tag, {}, "Hello World!!!");
  },
};
</script>
<!--父组件-->
<HelloWorld tag="h2"/>

这样就通过父子组件的传参实现了动态的创建标签。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T8l33lwG-1640198332892)(C:\Users\25218\AppData\Roaming\Typora\typora-user-images\image-20211223013219794.png)]

1.2 组件

我定义了一个MyButton的按钮组件(样式模仿了Element-ui),也是通过render函数渲染出来的组件。

<!--MyButton.vue-->
<script>
export default {
  //传参
  props: {
    type: {
      type: String,
      default: "normal",
    },
    text: {
      type: String,
      default: "",
    },
  },
  //渲染函数
  render(createElement) {
    return createElement("button", {
      //v-bind:class
      class: {
        btn: true,
        "btn-success": this.type === "success",
        "btn-error": this.type === "error",
        "btn-warning": this.type === "warning",
        normal: !this.type,
      },
      //dom属性
      domProps: {
        innerText: this.text || "默认按钮",
      },
    });
  },
};
</script>

<style scoped>
.btn {
  border: rgb(216, 224, 235) 1px solid;
  width: 100px;
  height: 40px;
  border-radius: 10px;
  cursor: pointer;
  font-weight: 500;
}

.normal {
  background: #fff;
  border: 1px solid #dcdfe6;
  color: rgb(96, 98, 102);
}
.btn:hover {
  color: #409eff;
  border-color: #c6e2ff;
  background-color: #ecf5ff;
}

.btn-success {
  color: #fff;
  background-color: #67c23a;
  border-color: #67c23a;
}

.btn-success:hover {
  background: #85ce61;
  border-color: #85ce61;
  color: #fff;
}

.btn-error {
  color: #fff;
  background-color: #f56c6c;
  border-color: #f56c6c;
}

.btn-error:hover {
  background: #f78989;
  border-color: #f78989;
  color: #fff;
}

.btn-warning {
  color: #fff;
  background-color: #e6a23c;
  border-color: #e6a23c;
}

.btn-warning:hover {
  background: #ebb563;
  border-color: #ebb563;
  color: #fff;
}
</style>
<!--HelloWorld.vue-->
<script>
import MyButton from "./MyButton.vue";
export default {
  //第一个参数为组件
  render(createElement) {
    return createElement(MyButton, {
      //MyButton组件需要type和text的参数
      props: {
        //按钮类型
        type: "error",
        //按钮文字
        text: "",
      },
    });
  },
};
</script>

这样就出来了一个error类型的按钮。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4fsycNRz-1640198332893)(C:\Users\25218\AppData\Roaming\Typora\typora-user-images\image-20211223023126098.png)]

2. createElement的第二个参数

2.1 attrs

<!--HelloWorld.vue-->
<script>
export default {
  //不用vue模板,使用render函数进行dom渲染,h->createElement
  //vue模板template最终也是要编译成render函数
  render(createElement) {
    return createElement(
      "div",
      {
        attrs: {
          class: "test",
        },
      },
      "Hello World!!!"
    );
  },
};
</script>

<!--使用渲染函数定义了class之后,直接在style标签中定义样式就可以使用了-->
<style scoped>
.test {
  color: red;
  font-size: 20px;
}
</style>

这样就定义了attrs中的class属性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ptCMZJ29-1640198332894)(C:\Users\25218\AppData\Roaming\Typora\typora-user-images\image-20211223015524941.png)]

2.2 on(事件监听器在 on 内)

<!--HelloWorld.vue-->
<script>
export default {
  //不用vue模板,使用render函数进行dom渲染,h->createElement
  //vue模板template最终也是要编译成render函数
  render(createElement) {
    return createElement(
      "div",
      {
        class: "test",
        on: {
          click: function () {
            console.log("执行点击事件");
          },
        },
      },
      "Hello World!!!"
    );
  },
};
</script>

<!--使用渲染函数定义了class之后,直接在style标签中定义样式就可以使用了-->
<style scoped>
.test {
  color: red;
  font-size: 20px;
}
</style>

点击字体时触发点击事件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-znAuHTem-1640198332896)(C:\Users\25218\AppData\Roaming\Typora\typora-user-images\image-20211223015843386.png)]

3. createElement的第三个参数

3.1 文本虚拟节点

同第一节的内容,写了一个 “Hello World!!!” 的内容

3.2 子级虚拟节点 (VNodes)

<!--HelloWorld.vue-->
<script>
export default {
  data: function () {
    return {
      tag: "ul",
      numArr: [1, 2, 3, 4],
    };
  },
  //不用vue模板,使用render函数进行dom渲染,h->createElement
  //vue模板template最终也是要编译成render函数
  render(createElement) {
    return createElement(
      this.tag,
      {},
      this.numArr.map((item) => {
        return createElement("li", {}, `${item}`);
      })
    );
  },
};
</script>

效果就是一个”ul“节点下包含着4个”li“节点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJrJu7Dc-1640198332897)(C:\Users\25218\AppData\Roaming\Typora\typora-user-images\image-20211223014735949.png)]

以上就是render渲染函数最基本的内容。

我是前端Dai,一个会将自己平时项目中常见的问题以及笔试面试的知识在优快云与大家分享的coder,希望大家一起进步,加油。

<think>好的,我现在要解决用户的问题:在vxe-grid中修改父节点的字体样式。首先,我需要明确用户的需求。用户提到的是“父节点”,可能是指vxe-grid的某个父容器,或者是指树形结构中的父级节点。根据上下文,用户之前的问题是关于Vue3中背景色过渡动画的实现,现在转向了vxe-grid的样式调整,所以可能需要考虑Vue3环境下使用vxe-grid的情况。 首先,我需要确认vxe-grid的文档。vxe-grid是个基于Vue的表格组件,支持树形结构。用户提到的“父节点”可能指的是树形表格中的父级行。如果是这样,修改父节点的字体样式需要通过CSS选择器来定位这些行,并应用样式。 接下来,用户可能已经尝试过直接修改样式但未生效,这可能是因为样式作用域的问题,或者vxe-grid内部使用了更具体的选择器,导致用户的自定义样式被覆盖。需要检查是否正确使用了深度选择器(如::v-deep)来穿透作用域。 另外,用户可能需要动态调整样式,比如根据条件改变字体颜色或大小,这时候可能需要结合Vue的动态绑定:class或:style。或者用户可能希望全局修改所有父节点的样式,这需要覆盖vxe-grid的默认样式。 考虑到用户之前的问题中有使用CSS变量和过渡动画的经验,或许用户希望使用类似的方法来动态修改字体样式。例如,通过CSS变量来定义字体样式,然后在父组件中动态改变这些变量。 还需要注意vxe-grid的版本,不同版本可能有不同的类名或结构,需要确保选择器正确。如果用户使用的是新版本,可能需要查阅新的文档来确认正确的类名。 总结可能的解决方案: 1. 使用CSS选择器定位父节点行,并应用字体样式。 2. 使用深度作用选择器来穿透scoped样式。 3. 动态绑定类名或样式,根据条件改变字体。 4. 通过全局样式覆盖默认样式。 5. 结合CSS变量实现动态主题切换。 需要验证这些方法的有效性,并考虑可能的兼容性问题,比如浏览器支持或vxe-grid的版本差异。同时,提供示例代码帮助用户理解如何实现。</think>在Vue3中调整vxe-grid父节点的字体样式,可以通过以下三种方式实现(基于组件特性与CSS作用域控制): ### 方案:全局样式覆盖(推荐基础方案) ```css /* 覆盖所有父节点行 */ .vxe-table--render-wrapper .vxe-table--body-row.vxe-body--row-parent { font-family: 'Microsoft YaHei'; font-size: 16px; color: #2c3e50; font-weight: 600; /* 加粗父节点 */ } /* 添加hover效果 */ .vxe-table--render-wrapper .vxe-table--body-row.vxe-body--row-parent:hover { background-color: #f5f7fa; } ``` ### 方案二:穿透式局部样式(支持动态主题) ```html <template> <vxe-grid ref="gridRef" :data="tableData"></vxe-grid> </template> <style scoped> /* 使用深度选择器穿透组件作用域 */ ::v-deep(.vxe-body--row-parent) { font-family: var(--vxe-parent-font); font-size: calc(var(--base-font-size) + 2px); color: inherit; /* 继承父级颜色 */ } /* 动态样式绑定 */ ::v-deep(.vxe-body--row-parent.is-active) { color: #1890ff; text-shadow: 0 2px 4px rgba(24,144,255,0.2); } </style> <script setup> // 动态更新CSS变量 const updateStyle = () => { document.documentElement.style.setProperty('--vxe-parent-font', 'Arial') } </script> ``` ### 方案三:动态行样式绑定(条件渲染) ```html <vxe-grid :row-style="rowStyle" :tree-config="{children: 'children'}" ></vxe-grid> <script setup> const rowStyle = ({ row }) => { if (row.hasChild) { // 判断是否为父节点 return { fontSize: '18px', fontWeight: 'bold', backgroundColor: '#fafafa' } } } </script> ``` ### 扩展:多级父节点样式差异化 ```css /* 第级父节点 */ ::v-deep(.vxe-body--row-parent[data-level="1"]) { color: #f5222d; } /* 第二级父节点 */ ::v-deep(.vxe-body--row-parent[data-level="2"]) { color: #faad14; } /* 第三级父节点 */ ::v-deep(.vxe-body--row-parent[data-level="3"]) { color: #52c41a; } ``` **实现原理说明:** 1. vxe-grid通过`vxe-body--row-parent`类标识父节点行[^1] 2. 树形层级通过`data-level`属性记录节点深度[^2] 3. 动态样式需配合`:row-style`属性实现条件判断[^3] 4. 使用CSS变量可实现主题切换时的平滑过渡效果[^4]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Dai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值