<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
相信 react
的夥伴對於 jsx/tsx
都不陌生吧,現在在 vue3
中也可以使用 jsx/tsx
語法拉。
vite
官方提供了官方的外掛來支援在vue3
中使用jsx/tsx
,直接安裝就行。
yarn add @vitejs/plugin-vue-jsx -D
安裝完之後在vite.config.ts
中插入一下程式碼
import vueJsx from "@vitejs/plugin-vue-jsx"; export default defineConfig({ plugins: [ vueJsx(), ] })
設定完就可以在專案中使用jsx/tsx
啦
jsx/tsx 的插值與 vue 模板語法中的插值一樣,支援有效的 Javascript表示式,比如:a + b
, a || 5
...
只不過在 jsx/tsx中 由雙大括號{{}}
變為了單大括號{}
// vue3模板語法 <span>{{ a + b }}</span> // jsx/tsx <span>{ a + b }</span>
class類名系結有兩種方式,使用模板字串或者使用陣列。
// 模板字串 <div className={`header ${ isBg ? 'headerBg' : '' }`}>header</div> //陣列 <div class={ [ 'header', isBg && 'headerBg' ] } >header</div>
style繫結需要使用 雙大括號
const color = 'red' const element = <sapn style={{ color, fontSize: '16px' }}>style</sapn>
v-show
指令,沒有 v-if
指令if/else
和三目表示式都可以實現setup() { const isShow = false const element = () => { if (isShow) { return <span>我是if</span> } else { return <span>我是else</span> } } return () => ( <div> <span v-show={isShow}>我是v-show</span> { element() } { isShow ? <p>我是三目1</p> : <p>我是三目2</p> } <div> ) }
同樣,jsx/tsx 中也沒有 v-for
指令,需要渲染列表我們只需要使用Js 的陣列方法 map
就可以了
setup() { const listData = [ {name: 'Tom', age: 18}, {name: 'Jim', age: 20}, {name: 'Lucy', age: 16} ] return () => ( <div> <div class={'box'}> <span>姓名</span> <span>年齡</span> </div> { prop.listData.map(item => { return <div class={'box'}> <span>{item.name}</span> <span>{item.age}</span> </div> }) } </div> ) }
繫結事件使用的也是 單大括號 {}
,不過事件繫結不是以 @
為字首了,而是改成了 on
,例如:click 事件是 onClick
如果需要使用事件修飾符,就需要藉助withModifiers
方法啦,withModifiers
方法接收兩個引數,第一個引數是繫結的事件,第二個引數是需要使用的事件修飾符
setup() { const clickBox = val => { console.log(val) } return () => ( <div class={'box1'} onClick={() => clickBox('box1')}> <span>我是box1</span> <div class={'box2'} onClick={() => clickBox('box2')}> <span>我是box2</span> <div class={'box3'} onClick={withModifiers(() => clickBox('box3'), ['stop'])}>我是box3</div> </div> </div> ) }
jsx/tsx是支援v-model語法的
// 正常寫法 <input v-model="value" /> // vue <input v-model={value} /> // jsx // 指定繫結值寫法 <input v-model:modelValue="value" /> // vue <input v-model={[value,'modelValue']} /> // jsx // 修飾符寫法 <input v-model:modelValue.trim="value" /> // vue <input v-model={[value,'modelValue',['trim']]} /> // jsx
定義插槽
jsx/tsx中是沒有 slot
標籤的,定義插槽需要使用{}
或者使用renderSlot
函數
setup 函數預設接收兩個引數 1. props 2. ctx 上下文 其中包含 slots、attrs、emit 等
import { renderSlot } from "vue" export default defineComponent({ // 從ctx中解構出來 slots setup(props, { slots }) { return () => ( <div> { renderSlot(slots, 'default') } { slots.title?.() } </div> ) } })
使用插槽
可以通過 v-slots
來使用插槽
import Vslot from './slotTem' export default defineComponent({ setup() { return () => ( <div class={'box'}> <Vslot v-slots={{ title: () => { return <p>我是title插槽</p> }, default: () => { return <p>我是default插槽</p> } }} /> </div> ) } })
主要功能就是根據路由資訊自動取生成選單
效果如下
程式碼如下,如果需要控制許可權啥的,自己在路由資訊的meta
中新增對應的引數,然後在menuItem
中自行控制
// index.tsx import { routes } from '@/router/index' import MenuItem from './menuItem' import './index.scss' export default defineComponent({ setup() { const isShowRoutes = computed(() => { return routes }) const currentPath = computed(() => { return useRoute().path }) return () => ( <el-scrollbar class={`menuContent`}> <el-menu default-active={currentPath.value} mode="vertical" class={'menu'} > { isShowRoutes.value.map((route) => { return <MenuItem item={route} key={route.path}></MenuItem> }) } </el-menu> </el-scrollbar> ) } })
// menuItem.tsx import { defineComponent, PropType } from 'vue' import { RouteRecordRaw } from 'vue-router' import './index.scss' const MenuItem = defineComponent({ name: 'MenuItem', props: { item: { type: Object as PropType<RouteRecordRaw>, required: true } }, setup(props: { item: any }) { const router = useRouter() const jumpRoute = (path: string) => { router.push(path) } return () => { let { item } = props if (item.children) { const slots = { title: () => { return <div> <span>{item.meta.title}</span> </div> } } return <el-sub-menu index={item.path} v-slots={slots}> {item.children.map((child: RouteRecordRaw) => { return <MenuItem item={child} key={child.path}></MenuItem> })} </el-sub-menu> } else { return <el-menu-item index={item.path} onClick={() => jumpRoute(item.path)}>{item.meta.title}</el-menu-item> } } } }) export default MenuItem
到此這篇關於如何在vue3中優雅的使用jsx/tsx的文章就介紹到這了,更多相關vue3優雅使用jsx/tsx內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45