vue jsx 記錄
template的寫法 是 vue 的靈魂,jsx的寫法就沒那味了。雖然我一直都是這麼相信的,但是template寫久了感覺沒啥新鮮感,於是打算用jsx的寫法來解悶。
寫jsx你需要準備什麼?啥都不需要,雖然官網建議安裝
@vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props,但是為了嚐鮮和減少對項目的影響,你可以直接在render函數內體驗jsx語法!
render函數
render 函數 需要返回一個 jsx 寫法的數據
render(){
return (<div class="wrapper">{this.contentRender()}</div>)
},
methods:{
contentRender(){
// 函數必須有返回值
return (<p>hello world!!</p>)
}
}
props傳遞
:xxx="xxx"改成xxx={xxx},如果訪問的是data或者props數據,要加上this.xxx
<parent data={this.data} ...></parent>
注意:1. .sync的修飾符在jsx用不了。2. v-model 改成 vModel
事件監聽
@改成on-
<parent on-success={()=>this.onSuccess()}></parent>
注意: 原生事件的修飾符可能用不了,官方的寫法需要安裝插件編譯 傳送門
v-if 和 v-for
v-if 可以用 js條件判斷和三元運算符來代替;v-for 可以用數組遍歷來代替
// v-if
{!!this.show && (<div>show me</div>)}
//or
{this.show? (<div>show </div>):(<div>hide </div>)}
// v-for
{
this.arr.map(item=>{
return (<p key={item.id}>{item.name}</p>)
})
}
v-on="$listeners" 和 v-bind="$attrs"
可以用
{props: ...this.$attrs, on: ...this.$listeners}代替
render(){
return <div {...{props: ...this.$attrs, on: ...this.$listeners}}></div>
}
filters過濾器
這個只能通過函數來調用,如果定義了全局的過濾器,可以通過 this.$options.filters拿到對應的過濾函數
自定義指令
定義一個數組對象,存儲對應的指令,然後通過展開符傳入
function itemRender(item){
let directives = [{name: 'lazy, value: item.src} ];
return <div {...directives}></div>
}
slot
slot插槽主要分為兩種情況:具名插槽,作用域插槽
定義插槽
可通過
this.$slots.xxx或者this.$scopedSlots.xxx定義slot
render(){
return (<div>{this.$slots.default}</div>)
// return (<div>{this.$scopedSlots&&this.$scopedSlots.default()}</div>)
}
注意: $slots 和 $scopedSlots 的區別在於 ,前者是對象,後者是函數,在調用函數之前要先判斷該函數是否存在
使用插槽
具名的插槽可以通過
slot="xxx"來使用,作用域的插槽要通過對象來調用
render(){
const scopedSlots = {
default:(data)=>{return <span>scoped slot</span>}
}
return (<div scopedSlots ={scopedSlots}>
<template slot="default"><span>default slot</span></template>
</div>)
}