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组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
vue-router路由懒加载及实现的3种方式
Feb 28 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
在vue中import()语法不能传入变量的问题及解决
Apr 01 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
vue/cli 配置动态代理无需重启服务的方法
May 20 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
PHP生成静态页面详解
2006/11/19 PHP
php 可变函数使用小结
2018/06/12 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
微信小程序实现多张图片上传功能
2020/11/18 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
python 获取字典键值对的实现
2020/11/12 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
sort命令的作用和用法
2012/11/04 面试题
平面设计师的工作职责
2013/11/21 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
职务聘任书范文
2014/03/29 职场文书
部门2014年度工作总结
2014/11/12 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
社区安全温馨提示语
2015/07/14 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL
SQL Server 中的事务介绍
2022/05/20 SQL Server
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers