Vue 3 企业级项目实战课
杨文坚
前阿里前端 Leader,前腾讯 IMWeb 团队高级前端工程师
6908 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
实战篇 (19讲)
Vue 3 企业级项目实战课
15
15
1.0x
00:00/00:00
登录|注册

04|模版语法和JSX语法:你知道Vue可以用JSX写吗?

你好,我是杨文坚。
前面几节课,我们讲解了很多 Vue.js 3 编译相关的内容,了解完 Vue.js 两个编译打包工具后,我们是时候要开始学习如何使用 Vue.js 3 进行实际的代码开发了。
这节课,我主要会从 Vue.js 的两种主要开发语法进行讲解,它们分别是模板语法和 JSX 语法。从中你不仅能了解到两种开发语法的差异,还可以知道怎么因地制宜地根据需求场景选择合适的语法,从而扩大个人的技术知识储备,更从容地应对用 Vue.js 3 开发项目过程中遇到的各种问题。
Vue.js 从版本 1.x 到版本 3.x,官方代码案例和推荐使用都是模板语法,那么这里我们也根据官方的推荐,优先来了解一下模板语法是怎么一回事。

什么是模板语法?

我们可以把 Vue.js 的模板语法,直接理解为 HTML 语法的一种扩展,它所有的模板节点声明、属性设置和事件注册等都是按照 HTML 的语法来进行扩展设计的。按照官方的说法就是“所有的 Vue 模板都是语法层面合法的 HTML,可以被符合规范的浏览器和 HTML 解析器解析”。
现在我举个例子,带你了解下模板语法的概念及其不同内容的作用。代码如下所示:
<template>
<div class="counter">
<div class="text">Count: {{state.count}}</div>
<button class="btn" v-on:click="onClick">Add</button>
</div>
</template>
<script setup>
import { reactive } from 'vue';
const state = reactive({
count: 0
});
const onClick = () => {
state.count ++;
}
</script>
<style>
.counter {
padding: 10px;
margin: 10px auto;
text-align: center;
}
.counter .text {
font-size: 28px;
font-weight: bolder;
color: #666666;
}
.counter .btn {
font-size: 20px;
padding: 0 10px;
height: 32px;
min-width: 80px;
cursor: pointer;
}
</style>
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Vue.js 3的开发语法包括模板语法和JSX语法两种主要方式。模板语法基于HTML语法的扩展,支持模板节点声明、属性设置和事件注册,同时也支持Vue.js自定义的属性语法,如v-on等。JavaScript代码放在script标签中,使用Composition API操作,而CSS样式代码与HTML中的使用方式一致,但可以加上scoped和lang属性。另一方面,JSX语法提供了更灵活的编程能力,适用于特定的开发需求。文章通过示例代码对比了模板语法和JSX语法的实现差异,帮助读者更好地理解两种语法的使用方式和区别。在实现需求场景上,JSX语法具有更灵活的功能实现和后续代码维护,尤其在动态组件渲染和条件渲染方面表现出明显优势。尽管两种语法各有优点,但并非互斥,可以共存互相使用。因此,在基于Vue.js 3开发的项目中,可以根据需求场景选择合适的语法,以便更从容地应对项目开发过程中遇到的各种问题。文章还提到了在团队中,不同技术能力的成员可以通过选择合适的语法来方便项目技术实现的沟通。同时,建议读者可以借鉴一些使用JSX语法的成熟Vue.js 3开源项目,以便更好地学习和应用JSX语法。文章还强调了在实际团队的项目开发中,选择某种技术或者技术模式时,不仅要考虑技术优缺点,还要考虑人员的能力程度,综合考虑选择出高效率的技术方案。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Vue 3 企业级项目实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 深山大泽平原
    用模板语法的数组实现组件的reverse: <template> <div class="template-reverse-box"> <template v-for="item in comArr"> <component :is="item.name"></component> </template> <button @click="changeModule">reverse</button> </div> </template> <script setup lang="ts"> import { reactive, markRaw} from 'vue'; import Module01 from './Module01.vue' import Module02 from './Module02.vue' import Module03 from './Module03.vue' import Module04 from './Module04.vue' type Item = { name: any } let comArr = reactive<Item[]>([ { name: markRaw(Module01) }, { name: markRaw(Module02) }, { name: markRaw(Module03) }, { name: markRaw(Module04) }, ]) const changeModule = () => { comArr.reverse() } </script>

    作者回复: 您好,你提供的代码非常棒!本课受限于篇幅,没能展开讲解Vue.js 3的<component /> 组件。

    2022-12-08归属地:重庆
    3
    5
  • ZR-rd
    JSX 不能配置 scoped 避免 CSS 样式干扰,那么 JSX 应该如何做才能避免样式干扰呢

    作者回复: 您好,避免样式干扰方式有很多。 1. 可以从className角度处理,比如可以约定一个className命名规律,尽量避免className重名。 2. 可以借助JS in CSS处理方案,比如用 styled-components这个npm模块。

    2022-12-02归属地:北京
    4
    1
  • 直须
    怎么在.vue文件中引入jsx组件呢

    作者回复: 您好,在.vue文件里可以直接引入JSX组件的,这个取决于所用的构建工具(Webpack、Vite等)是否加载了Vue JSX语法的编译插件。

    2023-02-09归属地:广东
    4
  • 飞雪👻
    想请教一下, 我不太明白在用JSX写转换顺序, render函数中-------转换顺序: {`${isReverse}`}------ 为什么不直接写作{ isReverse } , 而是用模板字符串包裹呢 ?

    作者回复: 您好,两种书写方式都可以的,本课代码只是写多一个模板字符串的使用,无特殊用意。

    2022-12-02归属地:陕西
    2
  • 都市夜归人
    用模板方法一样能通过调整数组的顺序去实现,而不是用v-if。这是为了使用JSX而这样做的吧,个人觉得例子举的不是很恰当。
    2022-11-30归属地:江苏
    1
    2
  • 请叫我潜水员
    dialog那个例子用模板是一样的效果,Dialog组件从dialog.vue中引入,然后创建一个相同的createDialog,使用效果一模一样。因为我就是这么用的
    2022-11-29归属地:广东
    3
    1
  • xhsndl
    1. 模板语法实现组件递归(借鉴了前辈的想法) <template v-for="item in array" :key="item"> <component :is="item"/> </template> <script> import A1 from "./A1.vue" import A2 from "./A2.vue" import A3 from "./A3.vue" import {reactive,markRaw} from "vue" let array = reactive([ markRaw(A1), markRaw(A2), markRaw(A3), ]) </script> 2. JSX实现模板组件递归 想法是将组件构造函数引入,结合数组对象来进行实现 // 预先用jsx语法实现了A组件,假设用text接收参数、onOk接收点击事件的回调函数 // 创建组件后返回onClose方法 <script> import {createA} from "./A.jsx" let A1 = createA({ text:'123456', onOk:() => { A1.onClose() } }) </script> // --------------- // 实现JSX的循环调用 <script> import {createA} from "./A.jsx" import {reactive} from "vue" let array = reactive(['123','456','789']) array.forEach(item => let temp = createA( text:item, onOk:() => temp.onClose() ) ) </script>
    2024-01-19归属地:贵州
  • Spike Jim.Fun
    jsx的css模块化可以使用postcss-modules实现
    2023-12-09归属地:中国香港
  • 中欧校友
    模板语法递归在组件内用name名再次引用,JSX在组件函数内直接使用函数名调用实现梯柜
    2023-07-30归属地:上海
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部