vue 使用 h函数

我的项目前端使用的vben-admin框架。现在有个需求需要在列表中显示一个自定义链接

先贴出做成功的效果如下图。

在做之前通过咨询和搜索得知 可以用vue的h函数来返回一个dom。

那我就去看vue官网对于h函数的说明和示例,大致浏览了一页,感觉还是有点迷糊。然后就搜索查别人使用的示例了。

首先我们需要 知道的是如何在列表中自定义渲染一个列, vbenadmin是基于 ant-design-vue 

封装的, ant-design-vue里面有个customRender属性是用来在列表里返回自定义渲染效果的。

然后在customRender函数中使用vue的h函数,我尝试过如下几种写法,最后成功的就是

 return  h('a', {href:text,text:"文件下载",target:"_blank"});

其他尝试的写法:

return  ()=>h('a', text,"文件下载");

return  ()=>h('a', {text},"文件下载");

return  h('a', {href:text},() =>"文件下载");

return  h('a', {href:text},"文件下载");

return  () =>h('a', {href:text},"文件下载");

用了上面这么多写法测试,都没有成功,最后再仔细看搜索h用法的示例中别人的说明,包括vue文档的说明,有一段重要的解释:

第一个参数既可以是一个字符串 (用于原生元素) 也可以是一个 Vue 组件定义。第二个参数是要传递的 prop,第三个参数是子节点。

当创建一个组件的 vnode 时,子节点必须以插槽函数进行传递。如果组件只有默认槽,可以使用单个插槽函数进行传递。否则,必须以插槽函数的对象形式来传递。

为了方便阅读,当子节点不是插槽对象时,可以省略 prop 参数。

按照上面的解释,第一个参数是原生元素字符串,比如"input"  "div"。 我需要用连接就是'a',这个是没错的,那第二个参数是要传递的属性,我开始以为只要传递属性值就可以了,然后仔细看示例发现人家是花括号里面成键值对的描述属性值的,所以我的第二个参数关于链接属性值应该写成 {href:text,text:"文件下载",target:"_blank"}。  而第三个参数说的是子节点,我这里都没有子节点,所以第三个参数不应该出现。

最后结果应该是  return  h('a', {href:text,text:"文件下载",target:"_blank"});

还有一点,不太明确的。为什么我开始在h前面加() => 没用呢, 是不是因为外层customRender 他也是函数,所以里面不能再用() =>表达了。

### Vue 3 中 `h` 函数使用方法 #### 创建 VNode 的基本语法 在 Vue 3 中,`h` 是一个全局 API,用于创建虚拟 DOM 节点 (VNodes)[^1]。其基础签名如下: ```javascript const vnode = h(type, props?, children?) ``` - **type**: 可以为 HTML 标签名字符串、组件定义对象或其它返回 VNode 的函数。 - **props** *(可选)*: 包含属性的对象,如类名、样式、事件监听器等。 - **children** *(可选)*: 子节点可以是单个 VNode 或者一组子 VNodes。 #### 示例:简单创建一个 VNode 下面的例子展示了如何利用 `h` 来构建最简单的按钮元素并赋予点击行为: ```javascript import { h } from 'vue'; // 定义渲染函数 function renderButton() { return h('button', { onClick(event) { console.log('Button clicked!', event); } }, 'Click Me'); } ``` 此代码片段会生成 `<button>Click Me</button>` 这样的 HTML 结构,并为其绑定了一个点击处理程序。 #### 使用于组合式API中 当与 Composition API 结合时,可以在 setup 方法内部调用 `h()` 构建动态的内容或者条件性的界面部分[^2]: ```javascript export default { setup(props, context) { const count = ref(0); function incrementCounter() { count.value++; } return () => h( 'div', null, [ h('p', `Count is ${count.value}`), h('button', { onClick: incrementCounter }, '+') ] ); }, }; ``` 上述例子实现了计数器功能,每当按下 '+' 按钮时更新显示数值[^4]。 #### 插槽 Slot 和 `h` 函数一起工作 为了支持具名插槽和作用域插槽,在传递给 `h` 的第三个参数里还可以嵌套更复杂的结构来描述这些特性: ```javascript return h(MyComponent, {}, { header: () => h('header', 'This is a header'), footer: ({ msg }) => h('footer', `${msg}!`) }); ``` 这里假设 MyComponent 接受两个名为 `header` 和 `footer` 的插槽;第二个插槽还接收来自父级的数据作为参数。 #### 关联问题探讨 通过以上介绍可以看出,`h` 不仅限于直接操作DOM,它也是实现高级特性的桥梁之一,比如高阶组件(HOCs),这使得开发者能够更加灵活地控制应用的行为模式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值