hooks翻譯過來是鉤子的意思,這個可能有一些模糊,簡單點說hooks就是一個函數(能夠複用的函數)
javascript
其實TypeScript並非一門新的語言,它是 JavaScript 類型的超集,typeScript那並非一個新語言,能夠理解爲增強JavaScript的buff,TypeScript最大的優點源於強大的類型系統,還有就是在編寫代碼的時候就能夠檢測出咱們可能由於粗心形成的沒必要要的錯誤css
npm install -g @vue/cli
# OR
yarn global add @vue/cli複製代碼
.
├── README.md
├── babel.config.js
├── package.json
├── postcss.config.js
├── public│
├── favicon.ico│
└── index.html├── src│
├── App.vue│
├── assets│
│ └── logo.png│
├── components│
│ └── HelloWorld.vue│
├── main.ts│
├── router│
│ └── index.ts│
├── shims-tsx.d.ts 容許你以 .tsx結尾的文件,在 Vue項目中編寫 jsx代碼│
├── shims-vue.d.ts 主要用於 TypeScript 識別 .vue 文件│
├── store│
│ └── index.ts│
└── views│
├── About.vue│
└── Home.vue
├── tsconfig.json
└── yarn.lock複製代碼
<template>
<div class="hello">
<h1>{{ msg }}</h1>
...
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Componentexport default class HelloWorld extends Vue {
@Prop() private msg!: string;
}
</script>複製代碼
Vue3.0尚未正式發佈,可是官方提供了Vue 2.x 可以提早體驗此API的庫@vue/composition-api
html
npm i @vue/composition-api -S複製代碼
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
Vue.use(VueCompositionApi)複製代碼
<template>
<div id="app">
</div>
</template>
<script lang="ts">
import { createComponent } from '@vue/composition-api'
export default createComponent({ ...})
</script>
複製代碼
實例:這是VueConf 2019尤大大在介紹的時候給出的一個例子,改爲ts版本前端
<template>
<div id="app">
<div class="hooks-one">
<h2>{{ msg }}</h2>
<p>count is {{ count }}</p>
<p>plusOne is {{ plusOne }}</p>
<button @click="increment">count++</button>
</div>
<!-- <router-view/> -->
</div>
</template>
<script lang="ts">
import { ref, computed, watch, onMounted, Ref, createComponent } from '@vue/composition-api'
interface Props {
name: string
}
export default createComponent({
props: {
name: {
type: String,
default: 'ssss'
}
},
components: {},
setup (props: Props, context) {
const count: Ref<number> = ref(0)
// computed
const plusOne = computed(() => count.value + 1)
// method
const increment = () => {
count.value++
}
// watch
watch(() => count.value * 2, val => {
console.log(`count * 2 is ${val}`)
})
// 生命週期
onMounted(() => {
console.log('onMounted')
})
// expose bindings on render context
return {
count,
plusOne,
increment,
msg: `hello ${props.name}`
}
}
})
</script>複製代碼
詳解:vue
<template>
<div id="app">
{{ msg }}
{{ count }}
</div>
</template>
<script lang="ts">
import { createComponent } from '@vue/composition-api'
export default createComponent({
props: {
name: String
},
setup (props) {
const count: Ref<number> = ref(0)
return {
msg: `hello ${props.name}`,
count
}
}
})
</script>複製代碼
當前,咱們使用所謂的 Options API 構建組件。爲了向 Vue 組件添加邏輯,咱們填充(可選)屬性,例如 data、methods、computed等。這種方法的最大缺點是其自己並非有效的 JavaScript 代碼。你須要確切地知道模板中能夠訪問哪些屬性以及 this 關鍵字的行爲。在後臺,Vue 編譯器須要將此屬性轉換爲工做代碼。所以咱們沒法從自動建議或類型檢查中受益。
java
<template>
<div id="app">
<div class="hooks-one">
{{state.double}}
{{state.count}}
<p>count is {{ count }}</p>
<button @click="increment">count++</button>
</div>
<!-- <router-view/> -->
</div>
</template>
<script lang="ts">
import { ref, computed, reactive, Ref, createComponent } from '@vue/composition-api'
interface State { count: number, double: number}
export default createComponent({ setup (props, context) {
const count: Ref<number> = ref(0)
const state: State = reactive({
count: 0,
double: computed(() => state.count * 2)
})
// method
const increment = () => {
count.value++ // 須要.value獲取,改變
state.count++
}
// expose bindings on render context
return {
increment,
state
}
}
})
</script>複製代碼
import { onMounted, onUpdated, onUnmounted, createComponent } from '@vue/composition-api';
export default createComponent({
setup() {
onMounted(() => {
console.log('mounted!');
});
onUpdated(() => {
console.log('updated!');
});
// destroyed 調整爲 unmounted
onUnmounted(() => {
console.log('unmounted!');
});
},
});複製代碼