LoginSignup
3
1

More than 5 years have passed since last update.

【Vue.js】Vue CLI 3 + tsx

Last updated at Posted at 2019-01-20

:tools: セットアップ

Vue CLI 3 でテンプレート生成

まずはvue createコマンドでテンプレート生成します。

$ vue create {{ YOUR_APP_NAME }}
  • Babel
  • TypeScript

上記2つの項目は必ずチェックを入れます。

:inbox_tray: インストール

vue-tsx-support をインストール

vue-tsx-supportをインストールします。
既にVue.jstsxを使えるライブラリが存在していました。

$ yarn add vue-tsx-support

:keyboard: 開発

コンポーネントの作成

src/components/HelloWorld.vue を削除して
新たにHelloWorld.tsx を作成します。

App.vue

App.vue のHelloWorldコンポーネントの呼び出し部分を修正します。

import HelloWorld from './components/HelloWorld.vue'

import HelloWorld from './components/HelloWorld'

拡張子.tsx は不要になります。

HelloWorld.tsx

作成したHelloWorld.tsx に記述していきます。

HelloWorld.tsx
import * as tsx from 'vue-tsx-support';
import { VNode } from 'vue';

export default tsx.component({
  name: 'HelloWorld',
  render(): VNode {
    return (
      <div>
        <h1>Hello World</h1>
      </div>
    );
  },
});

props

次に、App.vue からprops で渡されたmsg を表示します。

HelloWorld.tsx
export default tsx.component({
  name: 'HelloWorld',
  props: {
    msg: {
      type: String,
      required: true,
    },
  },
  render(): VNode {
    return (
      <div>
        <h1>{this.msg}</h1>
      </div>
    );
  },
});

if

render(): VNode {
  return (
    <div>
      {this.isShow && <h2>Hi {this.member.name}</h2>}
    </div>
  );
}

this.isShowtrueの場合に後続の<h2> タグが表示されます。

表示、非表示の切り替えではなく、文言を出し分けたい場合は三項演算子を使用します。

render(): VNode {
  return (
    <div>
      {this.isMember
        ? <h2>Hi {this.member.name}</h2>
        : <h2>Hi No Name User</h2>}
    </div>
  );
}

for

render(): VNode {
  return (
    <div>
      {Object.keys(this.member).map((key: string) => (
        <p>{key}: {this.member[key]}</p>
      ))}
    </div>
  );
}

CSS in JS

render(): VNode {
  return (
    <div>
      <h1 style={styles.msg}>{this.msg}</h1>
    </div>
  );
}

const styles = {
  msg: {
    fontSize: '24px',
    color: 'red',
  },
};

全体

HelloWorld.tsx
import * as tsx from 'vue-tsx-support';
import { VNode } from 'vue';

interface IData {
  isMember: boolean;
  member: {
    [key: string]: string | number,
    name: string,
    age: number,
    gender: string,
  };
}

export default tsx.component({
  name: 'HelloWorld',
  props: {
    msg: {
      type: String,
      required: true,
    },
  },
  data(): IData {
    return {
      isMember: true,
      member: {
        name: 'Caroline',
        age: 22,
        gender: 'female',
      },
    };
  },
  render(): VNode {
    return (
      <div>
        <h1 style={styles.msg}>{this.msg}</h1>
        {this.isMember
            ? <h2>Hi {this.member.name}</h2>
            : <h2>Hi No Name User</h2>}
        {Object.keys(this.member).map((key: string) => (
          <p>{key}: {this.member[key]}</p>
        ))}
      </div>
    );
  },
});

const styles = {
  msg: {
    fontSize: '24px',
    color: 'red',
  },
};

:pencil2: 最後に

Vue CLIvue-tsx-support のおかげで簡単にVue.js + tsx環境が出来上がりました。
作者の方々に感謝です。

tsxiffor は、好みの問題かもしれませんが、Vue.js<template>v-ifv-for を記述するよりかは、可読性が上がる気がします。

簡単に導入できるため、一度お試しすることをオススメします。

以上

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1