Vue3 高级语法(一)—— h函数、jsx

一、认识h函数

Vue推荐在绝大数情况下使用模板来创建你的HTML,然后一些特殊的场景,你真的需要JavaScript的完全编程的能力,这个时候你可以使用渲染函数 ,它比模板更接近编译器;

前面我们讲解过VNode和VDOM的改变:

  • Vue在生成真实的DOM之前,会将我们的节点转换成VNode,而VNode组合在一起形成一颗树结构,就是虚 拟DOM(VDOM);
  • 事实上,我们之前编写的 template 中的HTML 最终也是使用渲染函数生成对应的VNode;
  • 那么,如果你想充分的利用JavaScript的编程能力,我们可以自己来编写 createVNode 函数,生成对应的VNode;

那么我们应该怎么来做呢?使用 h()函数:

  • h() 函数是一个用于创建 vnode 的一个函数;
  • 其实更准确的命名是 createVNode() 函数,但是为了简便在Vue将之简化为 h() 函数;

二、h()函数 如何使用呢?

h()函数 如何使用呢?它接受三个参数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意事项:

  • 如果没有props,那么通常可以将children作为第二个参数传入;
  • 如果会产生歧义,可以将null作为第二个参数传入,将children作为第三个参数传入;

三、h函数的基本使用

h函数可以在两个地方使用:

  • render函数选项中;
    在这里插入图片描述

  • setup函数选项中(setup本身需要是一个函数类型,所有需要在箭头函数中再返回h函数创建的VNode);
    在这里插入图片描述

render函数实现计数器

在这里插入图片描述

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

export default {
  data() {
    return {
      counter: 0
    }
  },
  render() {
    return h('div', {class: 'app'}, [
      h('h2', null, `当前计数:${this.counter}`),
      h('button', {
        onClick: () => this.counter++
      }, '+1'),
      h('button', {
        onClick: () => this.counter--
      }, '-1')
    ])
  }
}
</script>

<style scoped>
</style>

setup函数实现计数器

在这里插入图片描述

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

export default {
  // data() {
  //   return {
  //     counter: 0
  //   }
  // },
  setup() {
    const counter = ref(0)
    return () => {
      return h('div', {class: 'app'}, [
        h('h2', null, `当前计数:${counter.value}`),
        h('button', {
          onClick: () => counter.value++
        }, '+1'),
        h('button', {
          onClick: () => counter.value--
        }, '-1')
      ])
    }
  }
}
</script>

<style scoped>
</style>

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

在这里插入图片描述

在这里插入图片描述
Home.vue:

<script>
import {h, ref} from "vue";
import HelloWorld from "./HelloWorld.vue";

export default {
  render() {
    return h(HelloWorld, null, {
      default: props => h('span', null, `app传到HelloWorld组件中的内容: ${props.name}`)
    })
  }
}
</script>

<style scoped>
</style>

HelloWorld.vue:

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

export default {
  render() {
    return h('div', null, [
      h('h2', null, 'Hello World!'),
      this.$slots.default ? this.$slots.default({name: 'zep'}) : h('span', null, '我是hellowrold插槽的默认值')
    ])
  }
}
</script>

<style scoped>

</style>

五、jsx的babel配置

如果我们希望在项目中使用jsx,那么我们需要添加对jsx的支持:

  • jsx我们通常会通过Babel来进行转换(React编写的jsx就是通过babel转换的);
  • 对于Vue来说,我们只需要在Babel中配置对应的插件即可;

注意:新版本的vue-cli中不需要进行安装和配置操作了!
安装Babel支持Vue的jsx插件:

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

在babel.config.js配置文件中配置插件:

在这里插入图片描述

六、jsx计数器案例

在这里插入图片描述

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

export default {
  setup() {
    const counter = ref(0)
    const increment = () => {
      counter.value++
    }
    const decrement = () => {
      counter.value--
    }
    return {
      counter,
      increment,
      decrement
    }
  },
  render() {
    return (
     <div>
       <div>当前计数: {this.counter}</div>
       <button onClick={this.increment}>+1</button>
       <button onClick={this.decrement}>-1</button>
     </div>
    )
  }
}
</script>

<style scoped>
</style>

七、jsx组件的使用

在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中,render函数语法和用法与Vue 2有所不同。下面是一个简单的示例,演示了Vue 3中render函数的用法: ```javascript import { createApp, h } from 'vue'; const app = createApp({ render() { return h('div', 'Hello, World!'); } }); app.mount('#app'); ``` 在上面的示例中,我们使用了`createApp`函数来创建一个Vue应用实例。在`createApp`函数的参数中,我们定义了一个`render`方法,它返回一个虚拟DOM节点。 在Vue 3中,我们使用了`h`函数(即`createElement`的别名),来创建虚拟DOM节点。在这个例子中,我们通过调用`h('div', 'Hello, World!')`来创建一个包含文本内容的div元素。 最后,我们调用`app.mount('#app')`将应用实例挂载到具有id为`app`的HTML元素上。 需要注意的是,Vue 3中的render函数可以使用JSX语法,这使得编写模板更加直观和灵活。下面是一个使用JSX语法的示例: ```javascript import { createApp } from 'vue'; const app = createApp({ render() { return ( <div> <h1>Hello, World!</h1> </div> ); } }); app.mount('#app'); ``` 在这个示例中,我们直接在render函数中使用了JSX语法来描述组件的结构。在Vue 3中,JSX语法是默认支持的,你可以使用它来编写更具表达力的模板代码。 这是Vue 3中render函数的一个简单示例,展示了它的基本语法和用法。根据实际需求,你可以在render函数中使用更多的Vue 3特性和API来创建复杂的组件和视图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值