中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在 vue 中使用 jsx 與 class component 的各種姿勢

發布時間:2020-08-01 20:26:17 來源:網絡 閱讀:549 作者:wx5d61fdc401976 欄目:開發技術

在之前我們分享過一次 一個使用 react 的思想去使用 vue 的方式。 隨著組內很多時候為了讓 view 層更加清晰,和一些復雜的邏輯處理,導致現在 vue 代碼中 jsx 的代碼越來越多,這里進行一個整理說明

如何使用
先參看騰訊 alloyTeam 這篇文章:

用 jsx 寫 vue 組件
里面有提到使用 babel-plugin-transform-vue-jsx babel 6 插件來處理 jsx 的編譯。

當然可能是官方也知道在一定的場景下 jsx 相對模板是有優勢的,于是單獨有了這個倉庫 對于上面的插件進行了增強。github.com/vuejs/jsx 在 babel 7+ 情況下可以參考使用

npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props
<!--.babelrc-->
{
"presets": ["@vue/babel-preset-jsx"]
}
復制代碼
你可以在 jsx 中使用 v-model 進行雙向綁定了!當然這只是一個語法糖。你也可以使用 babel 實現 v-for 。

對于一些簡單的情況我們直接使用 jsx 替換 template 都不會有什么問題,但是當我們深入下去,比如要看一些 react 的 特殊模式 比如:render props 在 vue 中的使用。那么我們就要對 vue 實例的屬性差異進行深入的對比和理解了。(render props 在vue中對應的就是 slotProps.default )

cn.vuejs.org/v2/guide/re…
www.yuque.com/zeka/vue/vu…
與組件庫結合的問題
對于 antd-vue 來說,由于 實現的api基本和 react 版本一致,所以調用方式基本和react版本的文檔也一致。

import {Input} form 'ant-design-vue'
<Input value={xx} onChange={(e)=>{}}>

//----

const HelloWorld = ({ props }) => <p>hello {props.message}</p>
復制代碼
但是也有一些沒有那么友好的組件庫, 比如 iview ,由于 內部大部分api都使用了 this.$emit('on-xxEvent') 的形式,在 template 語法下 @on-xxEvent="xx"覺得還好,但是在 jsx 語法下就顯得很奇怪了。如下:

<Input value={xx} on-on-Change={(e)=>{}}>
復制代碼
在上面我們處理完了直接使用 jsx 的問題。那么我們能不能更像 react 一點呢?

單文件組件
這個時候我們可能寫的一個 vue 單文件組件是這樣的:

VueForm.vue

<script>
export default {
name: 'VueForm',
props: {},
data() {
return {}
},
render(){
return (
<div>
<input />
</div>
)
}
}
</script>
<style ></style>
復制代碼
如何直接使用 .js 或者 jsx 文件?

VueForm.jsx

const VueForm = {
name: 'VueForm',
props: {},
data() {
return {}
},
methods:{

},
render(){
return (
<div>
<input />
</div>
)
}
}
VueForm.install = function(Vue) {
Vue.component(VueForm.name, VueForm);
};

export default VueForm;
復制代碼
還是好麻煩啊,每一個組件都的去定義 install 方法,也得去寫 methods 啥的,那么如何 再像一些呢?或者說更簡單一些呢?

class component
vue 官方提供了 vue-class-component 模塊 結合我們上面聊的,我們可以寫出來這樣的代碼。

import Vue from 'vue'
import Component from 'vue-class-component'

@Component({
props: {
propMessage: String
}
})
export default class App extends Vue {
// initial data
msg = 123
// use prop values for initial data
helloMsg = 'Hello, ' + this.propMessage
// lifecycle hook
mounted () {
this.greet()
}
// computed
get computedMsg () {
return 'computed ' + this.msg
}
// method
greet () {
alert('greeting: ' + this.msg)
}
render(){
return (
<input vModel={this.msg}>
<p>prop: {this.propMessage}</p>
<p>msg: {this.msg}</p>
<p>helloMsg: {this.helloMsg}</p>
<p>computed msg: {this.computedMsg}</p>
<button onClick={this.greet}>Greet</button>
)
}
}
復制代碼
當然僅僅是這樣可能還是不夠的 。你需要再來一個模塊 vue-property-decorator 甚至是 vuex-class

哈? 這不是 React + Mobx ?

我們可以看到 vue 的可擴展性是非常強的。恭喜你已經成功進入邪教。23333

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江津市| 清水河县| 香格里拉县| 河间市| 福建省| 吴川市| 张家界市| 乐平市| 珲春市| 延寿县| 桓仁| 胶州市| 尉犁县| 平湖市| 民勤县| 东阳市| 桂平市| 留坝县| 互助| 镇江市| 宜昌市| 嘉鱼县| 灵川县| 平利县| 岳池县| 金堂县| 长宁县| 新田县| 上高县| 东丰县| 湟源县| 班戈县| 江津市| 密云县| 叶城县| 盐津县| 诸城市| 巴马| 资阳市| 尚志市| 汉川市|