Skip to content

Commit 56d7396

Browse files
authored
Merge pull request #14 from WingGao/develop
添加TypeScript文档
2 parents 07f9d84 + 318fd35 commit 56d7396

File tree

2 files changed

+213
-0
lines changed

2 files changed

+213
-0
lines changed

docs/build/mpvue-loader.md

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,3 +198,212 @@ export default {
198198
### checkMPEntry
199199
[项目建构](/build/#module) 文档的这个部分,有讲到需要给所有 `js` 后缀文件增加 `mpvue-loader` ,并且需要加 options,通过这个配置,我们的 loader 才能知道 entry 进来的 js 和 vue 的类型是 app 还是 page,从而做了一些页面类型的区分。
200200

201+
## TypeScript支持
202+
`mpvue-loader`目前支持用TypeScript来写,功能还在完善中(WIP)。目前实现了用`<script lang="ts" src="./xx.ts"></script>`这种方式的自动识别,并且需要搭配[vue-property-decorator](https://github.com/kaorun343/vue-property-decorator)来使用。
203+
204+
### 配置
205+
206+
#### 添加对应的`loader`
207+
```js
208+
// webpack.conf.js
209+
module.exports = {
210+
//...
211+
module: {
212+
rules: [
213+
{
214+
test: /\.vue$/,
215+
loader: 'mpvue-loader',
216+
options: {
217+
//...
218+
ts: [ //添加对应vue的loader
219+
'babel-loader',
220+
{
221+
// loader: 'ts-loader',
222+
loader: 'awesome-typescript-loader',
223+
options: {
224+
// errorsAsWarnings: true,
225+
useCache: true,
226+
}
227+
}
228+
]
229+
}
230+
},
231+
// ts文件的loader
232+
{
233+
test: /\.tsx?$/,
234+
exclude: /node_modules/,
235+
use: [
236+
'babel-loader',
237+
{
238+
loader: 'mpvue-loader',
239+
options: {
240+
checkMPEntry: true
241+
}
242+
},
243+
{
244+
// loader: 'ts-loader',
245+
loader: 'awesome-typescript-loader',
246+
options: {
247+
// errorsAsWarnings: true,
248+
useCache: true,
249+
}
250+
}
251+
]
252+
},
253+
]
254+
// ...
255+
}
256+
```
257+
### main.ts
258+
```ts
259+
// main.ts
260+
import { Component, Emit, Inject, Model, Prop, Provide, Vue, Watch } from 'vue-property-decorator';
261+
import { VueConstructor } from "vue";
262+
263+
interface IMpVue extends VueConstructor {
264+
mpType: string
265+
}
266+
267+
// 添加小程序hooks http://mpvue.com/mpvue/#_4
268+
Component.registerHooks([
269+
// app
270+
'onLaunch', // 初始化
271+
'onShow', // 当小程序启动,或从后台进入前台显示
272+
'onHide', // 当小程序从前台进入后台
273+
// pages
274+
'onLoad', // 监听页面加载
275+
'onShow', // 监听页面显示
276+
'onReady', // 监听页面初次渲染完成
277+
'onHide', // 监听页面隐藏
278+
'onUnload', // 监听页面卸载
279+
'onPullDownRefresh', // 监听用户下拉动作
280+
'onReachBottom', // 页面上拉触底事件的处理函数
281+
'onShareAppMessage', // 用户点击右上角分享
282+
'onPageScroll', // 页面滚动
283+
'onTabItemTap', //当前是 tab 页时, 点击 tab 时触发 (mpvue 0.0.16 支持)
284+
])
285+
286+
Vue.config.productionTip = false
287+
// 在这个地方引入是为了registerHooks先执行
288+
const MyApp = require('./App.vue').default as IMpVue
289+
const app = new Vue(MyApp)
290+
app.$mount()
291+
```
292+
### App.vue
293+
```vue
294+
<script lang="ts" src="./app.ts"></script>
295+
<style></style>
296+
```
297+
```ts
298+
//app.ts
299+
import { Vue, Component } from 'vue-property-decorator'
300+
declare module "vue/types/vue" {
301+
interface Vue {
302+
$mp: any;
303+
}
304+
}
305+
306+
// 必须使用装饰器的方式来指定components
307+
@Component({
308+
mpType: 'app', // mpvue特定
309+
}as any)
310+
class App extends Vue {
311+
// app hook
312+
onLaunch() {
313+
let opt = this.$root.$mp.appOptions
314+
}
315+
316+
onShow() {
317+
}
318+
319+
onHide() {
320+
}
321+
322+
mounted() { // vue hook
323+
}
324+
}
325+
326+
export default App
327+
```
328+
### 页面
329+
```vue
330+
<!-- page.vue -->
331+
<template>
332+
<div class="counter-warp">
333+
<p>Mpvue</p>
334+
<p>ts value {{ ver }}</p>
335+
<card text="card component"></card>
336+
<comp-b text="card component"></comp-b>
337+
<a :href="AppUrls.COUNTER" class="home">去往vuex</a>
338+
</div>
339+
</template>
340+
<!--必须指定为ts-->
341+
<script lang="ts" src="./index.ts"></script>
342+
<style></style>
343+
```
344+
```ts
345+
// index.ts
346+
import { Vue, Component } from 'vue-property-decorator'
347+
import Card from '@/components/card.vue' // mpvue目前只支持的单文件组件
348+
import CompB from '@/components/compb.vue' // mpvue目前只支持的单文件组件
349+
// 必须使用装饰器的方式来指定component
350+
@Component({
351+
components: {
352+
Card,
353+
CompB, //注意,vue的组件在template中的用法,`CompB` 会被转成 `comp-b`
354+
},
355+
})
356+
class Index extends Vue {
357+
ver: number = 123
358+
359+
onShow() { // 小程序 hook
360+
}
361+
362+
mounted() { // vue hook
363+
}
364+
}
365+
366+
export default Index
367+
```
368+
369+
### 组件
370+
```vue
371+
<!-- card.vue -->
372+
<template>
373+
<div>
374+
<p class="card">
375+
From Card {{text}} {{ver}}
376+
</p>
377+
</div>
378+
</template>
379+
<!--必须指定为ts-->
380+
<script lang="ts" src="./card.ts"></script>
381+
<style></style>
382+
```
383+
```ts
384+
// card.ts
385+
import { Vue, Component, Prop } from 'vue-property-decorator'
386+
// 必须使用装饰器的方式来指定component
387+
@Component
388+
class Card extends Vue {
389+
@Prop({ default: '1' }) //注意用法!
390+
text: string;
391+
392+
ver: number = 2;
393+
394+
onShow() {
395+
}
396+
397+
onHide() {
398+
}
399+
400+
mounted() { // vue hook
401+
}
402+
}
403+
404+
export default CompB
405+
```
406+
407+
### 示例Demo
408+
409+
示例: [mpvue-ts-demo](https://github.com/WingGao/mpvue-ts-demo)

docs/mpvue/index.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,10 @@ mpvue 可以支持小程序的原生组件,比如: `picker,map` 等,需要
390390
</picker>
391391
```
392392

393+
## TypeScript支持
394+
395+
目前`mpvue-loader`是可以支持TypeScript选项的,配置方法[在此](/build/mpvue-loader/#typescript)。具体Demo可以见[mpvue-ts-demo](https://github.com/WingGao/mpvue-ts-demo)
396+
393397
## 最佳实践
394398

395399
**1. 精简 data 数据**

0 commit comments

Comments
 (0)