Vue h函数的使用详解


Posted in Vue.js onFebruary 18, 2022

一、认识

文档:https://v3.cn.vuejs.org/guide/render-function.html#dom-%E6%A0%91

​ h() 到底会返回什么呢?其实不是一个实际的 DOM 元素。它更准确的名字可能是 createNodeDescription,因为它所包含的信息会告诉 Vue 页面上需要渲染什么样的节点,包括及其子节点的描述信息。我们把这样的节点描述为“虚拟节点 (virtual node)”,也常简写它为 VNode 。“虚拟 DOM”是我们对由 Vue 组件树建立起来的整个 VNode 树的称呼。

二、使用

文档:https://v3.cn.vuejs.org/guide/render-function.html#h-%E5%8F%82%E6%95%B0

1、h() 参数

h() 函数是一个用于创建 VNode 的实用程序。也许可以更准确地将其命名为 createVNode(),但由于频繁使用和简洁,它被称为 h() 。它接受三个参数:

// @returns {VNode}
h(
    // {String | Object | Function} tag
    // 一个 HTML 标签名、一个组件、一个异步组件、或
    // 一个函数式组件。
    //
    // 必需的。
    'div',

    // {Object} props
    // 与 attribute、prop 和事件相对应的对象。
    // 这会在模板中用到。
    //
    // 可选的(在开发时。建议传,实在没有传的时候,传入 null)
    {},

    // {String | Array | Object} children
    // 子 VNodes, 使用 `h()` 构建,
    // 或使用字符串获取 "文本 VNode" 或者
    // 有插槽的对象。
    //
    // 可选的。
    [
        'Some text comes first.',
        h('h1', 'A headline'),
        h(MyComponent, {
            someProp: 'foobar'
        })
    ]
)

2、简单的使用

Vue h函数的使用详解

3、实现一个计数器案例

<script>
/* 设置样式需要在这引入,如果使用style标签,则不能写scoped,不利于设置局部样式,所以不建议 */
import "./style.css"
import { h, ref } from "vue";

export default {
    // data 的写法
    // data() {
    //     return {
    //         counter: 0
    //     }
    // },
    setup() {
        const counter = ref(0)
        return { counter }
    },
    /**
     * 使用setup的时候,下面也可以用this,引入render有绑定this,所以下面取值,要用this
     */
    render() {
        return h("div", null, [
            h("h1", null, `当前计数:${this.counter}`),
            h("button", { onClick: () => this.counter++, class: "button" }, "加 1"),
            h("button", { onClick: () => this.counter--, class: "button" }, "减 1")
        ])
    }
}
</script>

修改成纯setup的写法:

<script>
/* 设置样式需要在这引入,如果使用style标签,则不能写scoped,不利于设置局部样式,所以不建议 */
import "./style.css"
import { h, ref } from "vue";

export default {
    // data 的写法
    // data() {
    //     return {
    //         counter: 0
    //     }
    // },
    setup() {
        const counter = ref(0)
        return () => {
            return h("div", null, [
                h("h1", null, `当前计数:${counter.value}`),
                h("button", { onClick: () => counter.value++, class: "button" }, "加 1"),
                h("button", { onClick: () => counter.value--, class: "button" }, "减 1")
            ])
        }
    }
}
</script>

4、函数组件和插槽的使用

1)父组件

<script>
import { h, ref } from "vue";
import Test from "./components/Test.vue"
export default {
    setup() {
        return {}
    },
    render() {
        return h(Test, null, {
            // default 对应的是一个函数,default是默认插槽
            default: props => h("span", null, "父传入到组件中的内容:" + props.name)
        })
    }
}
</script>

2)子组件

<script>
import { h } from "vue";

export default {
    /**
     * 接收夫传入的内容
     */
    render() {
        return h("div", null, [
            h("div", null, "我是子组件"),
            /**
             * 在这判断别人是否传入
             * 也可以写 null,啥也不展示
             * 也可以在传入一个参数,使用的是 函数传参
             */
            this.$slots.default ? this.$slots.default({ name: "哈哈哈" }) : h("div", null, "我是子组件的默认值")
        ])
    }
}
</script>

注:在项目中,如果你像上面一样写代码,就太苦逼了,所以这个时候就要用 JSX。

三、jsx的使用

1、jsx的认识

jsx我们通常会通过Babel来进行转换(React编写的jsx就是通过babel转换的);

对于Vue来说,我们只需要在Babel中配置对应的插件即可;

文档:https://v3.cn.vuejs.org/guide/render-function.html#jsx

2、下载Babel插件支持vue(现在貌似脚手架直接支持)

npm install @vue/babel-plugin-jsx -D

3、配置babel

1)在根目录下创建 .babel.config.js

2)在.babel.config.js 里面加入,如下代码

module.exports = {
    presets: [
        "@/vue/cli-plugin-babel/preset"
    ],
    plugins: [
        "@vue/babel-plugin-jsx"
    ]
}

4、简单的使用

<script>
import { ref } from 'vue'
export default {
    setup() {
        let counter = ref(0)
        return { counter }
    },
    render() {
        return (
            <div>
                <div>JSX的使用</div>
                <h2>当前数字:{this.counter}</h2>
            </div>


        )
    }
}
</script>

5、计数器案例

<script>
import { ref } from '@vue/reactivity'

export default {
    setup() {
        let counter = ref(0)
        function add() {
            counter.value++
        }
        function decrement() {
            counter.value--
        }
        return { counter, add, decrement }
    },
    render() {
        return (
            <div>
                <div>JSX的使用</div>
                <h2>当前数字:{this.counter}</h2>
                <button onClick={this.add}>加 1</button>
                <button onClick={this.decrement} >减 1</button>
            </div >
        )
    }
}
</script>

6、组件和插槽的使用

1)父组件

<script>
import { ref } from '@vue/reactivity'
import Test from "./components/Test.vue"
export default {
    setup() {
        let counter = ref(0)
        function add() {
            counter.value++
        }
        function decrement() {
            counter.value--
        }
        return { counter, add, decrement }
    },
    render() {
        return (
            <div>
                <div>JSX的使用</div>
                {/* 如果这块使用setup里面的变量、方法 要加this */}
                <h2>当前数字:{this.counter}</h2>
                <button onClick={this.add}>加 1</button>
                <button onClick={this.decrement} >减 1</button>
                <hr />
                <Test>
                    {/* 这个里面写入传入的内容,也就是传入一个插槽 */}
                    {{ default: props => <p>我是父传入子的</p> }}
                </Test>
            </div >
        )
    }
}
</script>

2)子组件

<script>
export default {
    /**
     * 接收夫传入的内容
     */
    render() {
        return (
            <div>
                <p>我是组件</p>
                {/* 这块也有可能没穿,你要显示一个默认值,这个时候,你就要用三元运算符 */}
                {this.$slots.default()}
            </div>
        )
    }
}
</script>

 注:如果你要h函数来写组件,请仔细查看文档,以上讲解,只是入门级。

到此这篇关于Vue h函数的使用详解的文章就介绍到这了,更多相关Vue h函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
Vue router安装及使用方法解析
Dec 02 Vue.js
Vue 组件注册全解析
Dec 17 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
vue实现同时设置多个倒计时
May 20 Vue.js
一篇文章学会Vue中间件管道
Jun 20 Vue.js
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
Vue Element plus使用方法梳理
Dec 24 Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 #Vue.js
前端vue+express实现文件的上传下载示例
一篇文章告诉你如何实现Vue前端分页和后端分页
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 #Vue.js
vue3获取当前路由地址
Feb 18 #Vue.js
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 #Vue.js
vue项目支付功能代码详解
Feb 18 #Vue.js
You might like
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
jquery操作select大全
2014/04/25 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
小程序实现发表评论功能
2018/07/06 Javascript
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Python3实现定时任务的四种方式
2019/06/03 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
python requests库的使用
2021/01/06 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
毕业生自我推荐
2013/11/04 职场文书
安全员岗位职责
2013/11/11 职场文书
师范毕业生个人求职信
2013/12/09 职场文书
双十佳事迹材料
2014/01/29 职场文书
村党支部换届选举方案
2014/05/02 职场文书
市场营销专业自荐书
2014/06/10 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
初中数学教学反思范文
2016/02/17 职场文书
初中地理教学反思
2016/02/19 职场文书
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python
java版 简单三子棋游戏
2022/05/04 Java/Android