Vue学习随笔(二)

本文深入探讨Vue.js的全局API,包括自定义指令的实现与生命周期,以及如何使用Vue.extend构造器创建组件。通过示例代码,详细解析了自定义指令的绑定、插入、更新、组件更新和解绑阶段,同时展示了如何利用Vue.extend生成组件实例。

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

全局API

首先,什么是全局API?
全局API并不在构造器里,而是先声明全局变量或者直接在Vue上定义一些新功能,Vue内置了一些全局API,比如Vue.directive,说的简单写就是,在构造器外部用Vue提供给我们的API函数来定义新的功能。

Vue.directive自定义指令

<body>
{% verbatim %}
<div id="app">
  <div v-huang="color">{{ num }}</div>
    <p><button @click="add">ADD</button></p>
</div>

{% endverbatim %}
</body>
<script>
    Vue.directive('huang',function (el,binding) {
        //<div v-huang="color"></div>这个标签
        console.log(el);
        //obj={name: "huang", rawName: "v-huang", value: "red", expression: "color", modifiers: {…}, …}
        console.log(binding);
        //huang
        console.log(binding.name);
        //red
        console.log(binding.value);
        //color
        console.log(binding.expression);
        el.style = 'color:'+binding.value;
    });
    new Vue({
  el: '#app',
  data: {
	num:10,
    color:'red'
  },
    methods:{
      add:function () {
          this.num++;
      }
    }
});
</script>

自定义指令的生命周期

自定义指令有五个生命周期(也叫钩子函数),分别是bind,inserted,update,componentUpdated,unbind

  • bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个绑定时执行一次的初始化动作。
  • inserted:被绑定元素插入父节点时调用(父节点存在即可调用,不存在于document中)。
  • update:被绑定于元素所在的模板更新时调用,而无论绑定值是否变化,通过比较更新前后的绑定值,可以忽略不必要的模板更新。
  • componentUpdated:被绑定元素所在模板完成一次更新周期时调用。
  • unbind:只调用一次,指令与元素解绑时调用。
<body>
{% verbatim %}
<div id="app">
  <div v-huang="color">{{ num }}</div>
    <p><button @click="add">ADD</button></p>
</div>
<p>
    <button onclick="unbind()">解绑</button>
</p>
{% endverbatim %}
</body>
<script>
    function unbind(){
        app.$destroy();
    }
    Vue.directive('huang',{
        bind:function (el,binding) {//被绑定
            console.log('1 - bind');
            el.style = 'color:'+binding.value;
        },
        inserted:function () {//绑定到节点
            console.log('2 - inserted');
        },
        update:function () {//组件更新
            console.log('3 - update');
        },
        componentUpdated:function () {//组件更新完成
            console.log('4 - componentUpdated');
        },
        unbind:function () {//解绑
            console.log('5 - unbind');
        }
    });
    new Vue({
  el: '#app',
  data: {
	num:10,
    color:'red'
  },
    methods:{
      add:function () {
          this.num++;
      }
    }
});
</script>

Vue.extend构造器的延伸

首先,什么是Vue.extend?
Vue.extend返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue实例构造器,经常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件名称作为标签的自定义元素时,会自动调用"扩展实例构造器"来生产组件实例,并挂载在自定义元素上。

<body>
{% verbatim %}

    <div id="author"></div>
{% endverbatim %}
</body>
<script>
    var authorExtend = Vue.extend({
        template:"<p><a :href='authorURL'>{{ authorName }}</a></p>",
        data:function () {
            return{
                authorName:'huangyongpeng',
                authorURL:'http://www.baidu.com'
            }
        }
    });
    new authorExtend().$mount('#author');

</script>
<think>首先,用户的问题是关于Vue中的render函数的使用:他们想学习Vue render函数的教程、使用方法和示例。我需要根据系统级指令来构建我的回答。 系统级指令包括: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] - 回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 - 参考提供的站内引用(尽管这些引用是关于Vue render函数的,但用户的问题直接相关)。 用户提供的引用: - [^1]: Vue渲染函数 - render 函数。文章目录包括什么是render函数、页面展示过程等。 - [^2]: vue render生成html,Vue Render函数简介及示例。提到模板编译成render函数,render函数更强大但可读性差。 - [^3]: Vue随笔【render函数的使用】。描述render函数允许用JavaScript描述DOM结构。 - [^4]: vue源码分析(五)——vue render 函数的使用。示例代码:使用render函数渲染数据。 我的回答需要基于这些引用,但确保内容真实可靠。我应该结构化回答,包括: 1. 什么是render函数? 2. 为什么使用render函数? 3. 如何使用render函数(基本用法、参数、示例)? 4. 实际应用和注意事项。 5. 生成相关问题。 关于数学表达式:由于主题是Vue.js,不是数学相关的,所以我可能不需要使用数学表达式。但指令说所有行内数学表达式必须使用$...$,如果出现数学内容,才需要。在这个上下文中,不太可能,但如果有计算或公式,我会应用。例如,如果提到算法复杂度,但这里不相关。 回答结构: - 开头介绍render函数。 - 逐步解释使用方法和示例。 - 结尾生成相关问题。 - 在引用段落末尾添加引用标识。 使用中文回答。 生成相关问题:在回答结束时,添加"§§相关问题§§"部分,列出2-3个相关问题。 引用处理:当引用内容时,在末尾加[^n]。例如,如果我从引用[^1]中提取信息,我会在句子结束时加[^1]。 我的回答大纲: 1. **介绍render函数**:解释什么是render函数,为什么有用。 - 基于引用[^1]、[^2]:render函数允许用JavaScript描述DOM结构,提供更多灵活性;模板编译成render函数。 2. **页面展示过程**:简要说明Vue如何渲染组件。 - 基于引用[^1]。 3. **render函数的参数**:详细解释参数,如`h`函数(createElement)。 - 基于引用[^1]、[^3]。 4. **基本用法和示例**:提供简单代码示例。 - 使用引用[^4]的示例:`h('div', { attrs: { id: 'app1' } }, this.message)` - 添加更多示例,如条件渲染、列表渲染。 5. **实际使用和注意事项**:讨论何时使用render函数,优缺点。 - 基于引用[^2]:render函数更强大但可读性差;模板更简单。 6. **View Design组件中的使用**:如果引用提到,可以简要涉及。 - 引用[^1]提到"View Design 组件中的使用",但未提供细节,所以我可以忽略或简要提及。 7. **结尾**:总结,鼓励实践。 8. **相关问题**:列出2-3个相关问题。 确保代码块正确:在示例中使用代码块,如Python示例中所示。 现在,构建具体内容: - 什么是render函数:render函数是Vue.js中的一个高级功能,允许开发者使用JavaScript来直接定义组件的DOM结构,而不是使用模板语法。这提供了更大的灵活性[^1][^3]。 - 为什么使用:当需要动态生成内容、进行复杂逻辑处理时,render函数比模板更合适[^2][^3]。 - 参数:render函数接收一个`createElement`函数(通常缩写为`h`)作为参数,用于创建虚拟DOM节点[^3][^4]。 - 基本示例:展示一个简单的render函数返回一个div元素。 - 进阶示例:条件渲染、传递属性等。 - 注意事项:render函数可读性较低,建议在需要时使用[^2]。 生成相关问题: 1. render函数与模板语法的区别是什么? 2. 如何在render函数中处理事件和插槽? 3. render函数在Vue 3中有何变化? 最后,添加引用标识。</think>### Vue render 函数教程:使用方法和示例 Vue.js 的 render 函数是一个高级功能,允许开发者直接使用 JavaScript 描述组件的 DOM 结构,而不是依赖模板语法。它提供了更大的灵活性,特别适用于动态渲染、复杂逻辑或性能优化场景[^3]。在本教程中,我将逐步介绍 render 函数的基础知识、使用方法和实际示例,帮助你快速上手。 #### 1. 什么是 render 函数? 在 Vue 中,render 函数是组件的核心渲染机制。它接收一个 `createElement` 函数(通常缩写为 `h`)作为参数,并返回一个虚拟 DOM 节点(VNode)。当组件需要渲染时,Vue 会调用 render 函数生成 VNode,再将其转换为真实 DOM[^1]。值得注意的是,Vue 的模板语法在编译时也会被转换为 render 函数,但直接使用 render 函数可以绕过模板限制,实现更精细的控制[^2]。 #### 2. 为什么使用 render 函数? - **灵活性**:适合动态生成内容,如根据数据动态创建元素。 - **性能优化**:在复杂场景下(如大型列表),render 函数可以避免模板解析的开销。 - **高级功能**:支持 JSX 或自定义渲染逻辑,适用于组件库开发。 - **缺点**:可读性较差,调试较复杂,建议仅在模板无法满足需求时使用[^2][^3]。 #### 3. render 函数的参数 render 函数的基本语法为: ```javascript render(h) { // h 是 createElement 函数,用于创建 VNode return h(tag, data, children); } ``` - **`tag`** (必填):元素标签名(字符串)或组件选项。 - **`data`** (可选):一个对象,包含属性(如 `attrs`、`props`)、事件监听器(如 `on`)等。 - **`children`** (可选):子节点数组或字符串,可以是文本或其他 VNode[^3][^4]。 #### 4. 基本使用方法和示例 下面通过几个示例演示 render 函数的常见用法。所有示例基于 Vue 2,但原理适用于 Vue 3(注意:Vue 3 中 `h` 函数需要从 `vue` 导入)。 **示例 1: 基本渲染** 创建一个简单的 div 元素,显示数据绑定内容。 ```javascript import Vue from 'vue'; new Vue({ el: '#app', data() { return { message: 'Hello, Vue render 函数!' }; }, render(h) { return h('div', { attrs: { id: 'app' } }, this.message); } }); ``` - **解释**:`h('div', ...)` 创建一个 div 元素,`attrs: { id: 'app' }` 设置 id 属性,`this.message` 作为子节点文本[^4]。 **示例 2: 传递属性和事件** 添加点击事件和 CSS 类。 ```javascript render(h) { return h('button', { attrs: { class: 'btn' }, on: { click: () => alert('按钮被点击!') } }, '点击我'); } ``` - **解释**:`attrs: { class: 'btn' }` 添加 CSS 类,`on: { click: ... }` 绑定点击事件[^3]。 **示例 3: 条件渲染** 根据数据动态显示元素。 ```javascript data() { return { showText: true }; }, render(h) { const children = []; if (this.showText) { children.push(h('p', '这段文字可见')); } return h('div', children); } ``` - **解释**:使用 `if` 语句控制子节点的添加,实现条件渲染[^3]。 **示例 4: 列表渲染** 渲染动态列表。 ```javascript data() { return { items: ['苹果', '香蕉', '橙子'] }; }, render(h) { return h('ul', this.items.map(item => h('li', item))); } ``` - **解释**:`map` 方法遍历数组,为每个项创建 li 元素[^1]。 #### 5. 实际应用场景和注意事项 - **实际使用**:在组件库(如 View Design)中,render 函数常用于创建可复用的高阶组件或处理动态插槽[^1]。 - **注意事项**: - **可读性**:render 函数比模板语法更晦涩,建议添加注释。 - **性能**:在简单场景下,模板更高效;复杂逻辑时,render 函数可能更快。 - **Vue 3 兼容**:Vue 3 中需从 `vue` 导入 `h` 函数(`import { h } from 'vue'`)[^2]。 - **替代方案**:对于大多数项目,模板语法(`.vue` 文件)更易维护。仅在需要时切换到 render 函数[^2][^3]。 #### 6. 学习资源 - 官方文档:[Vue Render 函数指南](https://vuejs.org/guide/extras/render-function.html) - 练习建议:从简单组件开始,逐步添加动态逻辑,使用 Vue Devtools 调试 VNode。 通过掌握 render 函数,你可以解锁 Vue 的底层渲染能力,解决模板无法处理的复杂问题。实践中,优先考虑模板,仅在必要时使用 render 函数以保持代码可维护性[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值