20200101のvue.jsに関する記事は8件です。

Vue.js+Flaskの環境構築備忘録〜Anaconda3を添えて〜

はじめに

私が愛用しているFlaskでVueを使いたくなったので環境構築手順をメモしておきます。
自分用の走り書きです。

登場人物

  • Vue.js(Vue CLI)
  • Flask
  • Anaconda3

手順

conda仮想環境の作成

Anaconda3で必要なライブラリをインストールした仮想環境を作る。
僕は大概、conda環境の中身にscriptsという開発フォルダを作成しています。
なので、その中にflaskフォルダとvueフォルダを作成します。

flask環境構築

from flask import Flask, render_template, request, jsonify, make_response, send_file
app = Flask(__name__, static_folder='../vue/dist/static', template_folder='../vue/dist')

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == "__main__":
    app.run()

template_folderとstatic_folderでvueのビルドフォルダを指定しておく。

vueアプリケーション作成とビルド設定

vueフォルダにアプリケーションを作成します。
僕はvue uiでサクッと作成します。
vueフォルダ直下にvue.config.jsという設定ファイルを作成し、以下のとおりにします。

module.exports = {
    assetsDir: 'static',
  };

.jsファイルやらを全てdist/staticフォルダに保存するという設定です。

完成

vueでビルド後にflaskサーバを起動すれば、vueアプリケーションが読み込まれます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

アプリ音痴の両親のためにLINEで共有した写真をデジタルフォトフレーム風にするアプリを作った話

この記事はぷりぷりあぷりけーしょんず Advent Calendar 2019の22日目の記事です。

はじめに

大遅刻スミマセン。、
まさかの年越してからアドベントカレンダーに登録するという最早アドベントカレンダーとはなんぞやな状況です。
師走の風に流され、忙しさのあまり年内に完成させ記事にする予定のアプリが新年初コミットとともに完成に至る形になりました。

さて、年を越したと同時にエンジニアに転職して丸3年が経ちました。
1年半ほど前は丸3年経つまでにサーバー・ネットワークの設定からアプリの開発、何かしらのサービスの一般公開をしたいというのを目標に業務とは別に個人学習、開発を行なっていました。
結果的にサーバー・ネットワークの設定,何かしらのサービスの一般公開というのは叶うことはなかったわけですが個人的に家族のための使うことができるレベルのアプリを作成することが叶いました。

作ったもの

私の両親はまあアプリ音痴でインスタグラムはもちろんのこと、LINEがギリギリ使えるレベルです。その割に父親はガジェット好きでiPadはいっちょ前に4台持っています。
いっちょ前にリビングに立て掛けてあるiPadを有効活用してもらいたいと思いLINEだけで完結するデジタルフォトフレームアプリfamiphoto(famip○rtからパクったとかは言わない)を作成しました。

DSC_2667.JPG

アーキテクチャ

Untitled Diagram (1).jpg

ざっくり上記のようになっており、アプリのフローとしては以下の通りです。

  1. LINEグループにMessagingAPIで作成したbotを招待
    UUIDを作成し、グループIDをキーにDynamoDBに保存、S3にUUIDのディレクトリを作成
  2. 今まで通り画像を共有(ここ重要)
    グループIDからUUIDを取得し、画像をUUIDのディレクトリに保存
  3. famiphoto urlとメッセージを送るとデジタルフォトフレームのurlを返す
    urlはhttps://***firebase.app/family/{uuid}
  4. urlにアクセスするとデジタルフォトフレームとして起動しリビングに飾る
    裏では{uuid}をリクエストパラメータにAPIGatewayからLambdaを起動し、S3の画像URL一覧を取得してる
  5. PWAなのでホームに落としてあげれば、普通にiPad使いたいときは普通に使ってもらい、飾っておくときはアプリを起動して置くだけで良い

使用している技術は
- AWSLambda Runtime-Go
- DynamoDB
- S3
- Firebase hosting
- Vue.js
- PWA

AWS側のインフラ周りはCDKで管理しておりTypescriptで記述しています。

実装

実装の面で特別記述するような話はないのですが、初めて挑戦したような箇所もありそれぞれでハマった所、苦労した所を自分へのメモとして残しておきます。
もし参考になれば幸いです。

CDK

APIGateway, Lambdaを使ったCDKは何度か構築したことがありますが今回初めてクエリパラメータ使うことになりました

stack.ts
    // API Gateway
    const api = new apigateway.RestApi(this, `api`, {
      restApiName: `api`,
    })

    // Lambda
    const lambdaHandler = new lambda.Function(this, `api`, {
      code: lambda.Code.fromAsset("../bin"),
      handler: "main",
      runtime: lambda.Runtime.GO_1_X,
    })

    const lambdaHandlerIntegration = new apigateway.LambdaIntegration(lambdaHandler, {proxy: true})
    api.root.addResource(`api`)
    api.root.addMethod("GET", lambdaHandlerIntegration, {
      requestParameters: {
        "method.request.querystring.{parameter_name}": true
      }
    })

一部を適当に抜粋していますが大体上記の通り設定していきます。

apigateway.root.addMethodのoptionにrequestParametersを定義し、"method.request.querystring.{parameter_name}"でクエリパラメータを設定できます。
今回自分の場合はuuidで処理を行っていくので"method.request.querystring.uuid"となります。

lambda側で取得する際は以下の通りです

lambda.go
func handler(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    uuid = req.QueryStringParameters["uuid"])
    ....
}

Lambda × Go

LambdaでのGoというより、Lambdaでのline-sdk-goの話ですがこれは以前の記事でも書かせていただきました。

APIGatewayProxyRequestをline-bot-sdk-go/linebot.Eventにパース

それ以外にもBodyを返す際にちょいと苦労(ドキュメント読めば良い話だったわけですが)したので何をしてるかそのまま転載します。

controller.go
type ContentsResponse struct {
    Body []string `json:"contents"`
}

func handler(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    contents, err := c.photo.GetContentURLs(req.QueryStringParameters["uuid"])
    if err != nil {
        err = fmt.Errorf("Failed get contents: %v ", err)
        return errorResponse(err), err
    }

    body, err := json.Marshal(&ContentsResponse{
        Body: contents,
    })
    if err != nil {
        return events.APIGatewayProxyResponse{}, err
    }

    return events.APIGatewayProxyResponse{
        StatusCode:      200,
        Body:            string(body),
        IsBase64Encoded: false,
    }, nil
}

PWA

フロントの知識がほぼ皆無な私が今回PWAを選定した理由はアプリのフローであげている今まで通り画像を共有(ここ重要)してもらい普通にiPad使いたいときは普通に使ってもらい、飾っておくときはアプリを起動して置くだけで良いようにしたかったからです。

PWAのアプリをFirebaseでhostingする記事はググればたくさん出てくるのでハマることは特にありませんでした。(ありがとうございます)

firebaseにhostingする際はbuild時に生成されるdistを参照するように設定されているわけですがURLは先述の通りhttps://***firebase.app/family/{uuid}となります。
これはuuidで画像のURLのリストを取るためなのですがアプリごとにuuidを切り替えられるようにしたいためPWAとして起動する際のstart_urlを動的に変更する必要があります。

PWAのmanifest.jsonを動的に生成する
↑こちらの記事を参考にさせていただき、ほぼそのまま使わせていただきました。
しかしこれだとbuildするたびにdist/index.htmlが毎回書き変わってしまい、<link rel=manifest>にidを付与する必要ができるため下記のようなスクリプトを用意してbuild時はこれを使うようにしています。

build.sh
#bin/bash
npm run build
sed -i  's/href=\/manifest.json/id="my-manifest"/g' ./dist/index.html

終わりに

個人開発というとどうしても途中で投げ出してしまったり、アイデアで出しで設計終わったらそれっきりだったり、設計拘ってたら飽きたりと色々続かないことが多いです。
今回の開発で思ったのは

  1. 初挑戦は1つ〜2つくらい(規模によると思う)
  2. 今までの知識のアップデートを中心に
  3. 時間のかかりそうな箇所は得意分野で
  4. わからなそうな領域はググってコピペでいいから終わらせる

というのがアプリを作る際のモチベーション維持の要になるように思います。
今回の私のアプリでいうと

  1. PWA
  2. Go, Vue.js
  3. CDK, Firebase
  4. 画像のフルスクリーン表示やスライドショーぽくするところ

といったところでしょうか。

エンジニア丸3年経過時の目標へのコミットは残念ながら届きませんでしたが全くの未経験から相談なしにエンジニアへの転職をしてやって見せてやることはできたかと思います。(父親は令和の世を生きる人間とは思えない程固い人間)

ここまで作ることができ、あとはやる気次第だと思うので2020年のアドベントカレンダーでは一般公開したサービスの記事を書けるように変わらずマイペースに個人開発をしていきたいと思います。

参考

Vue CLI 3 で PWA チュートリアル(Service Workers / Add to Home Screen / Push Notifications)
とっても簡単!Vueでフルスクリーン機能を実装する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

フロントエンド素人大学院生が爆速でVue.jsでポートフォリオを作った話【Firebaseと連携編】

始めに

明けましておめでとうございます.(執筆時:2020/1/1)
年末年始は一緒にゆっくりする友達もいないのでやったことない技術分野にチャレンジしています.
前回までの記事は

です.

最終的に作ったもの(再掲)

実際に作ったポートフォリオはこちら
スクリーンショット 2019-12-31 6.24.22.png

github pagesで公開しています.
また,ソースコードはこちら

今回のゴール

前回までで,【表示させたいコンテンツ】を【cardコンポーネント】に表示することが出来るようになりました.
しかし,【表示させたいコンテンツ】はソースコードにハードコーディングしてしまっていて,美しくありません.
このままでは,【表示させたいコンテンツ】をちょっとだけ編集したいときに,ソースコードを編集して,masterブランチにマージして,本番環境でbuildして...ってめんどくさいです.

そこで,【表示させたいコンテンツ】はどこかから動的に取ってくるような仕組みにしようと思います.
そのような仕組みを作るのに便利なのが,FirebaseというgoogleのBaasです.
(本当はただただFirebaseを使ってみたいだけ)

Firebaseには枚挙に暇がないくらい便利なものがたくさんあるのですが,
今回はその中でも,Cloud Firestoreを使います.
Cloud FirestoreはいわゆるNoSQLデータベースというものを提供してくれます.
Cloud Firestoreに【表示させたいコンテンツ】を保存させておき,Vue.jsで取得して表示させる仕組みを作っていきましょう.

ちなみに,本記事の環境は,
- vue cli4でプロジェクトを作ってgithub pagesに公開する + travisでCI/CD
- フロントエンド素人大学院生が爆速でVue.jsでポートフォリオを作った話
- フロントエンド素人大学院生が爆速でVue.jsでポートフォリオを作った話【Cardデザイン】
で作った環境を前提としています.

参考

Cloud FireStoreとVue.jsでデーターベース通信を行う

事前準備

Firebaseにアプリを作成

Firebaseを使うにあたって,まずはFirebaseにアプリを登録する必要があります.

Firebaseへアクセスし,[使ってみる]
ボタンを押してください.
(Firebase自体を初めて使う人は,登録作業が必要になるかもしれません.)
スクリーンショット 2020-01-01 17.43.51.png

遷移した先のページで,[プロジェクトの追加]ボタンを押してください.
そして,画面の誘導にしたがってプロジェクトの作成を行ってください.

無事プロジェクトが作成できたら,次のような画面になると思います,
スクリーンショット 2020-01-01 17.50.21.png

次は,上記画面の,</>を押してWebアプリを追加していきます.
このとき,アプリのニックネームは適当に好きな名前を登録し,Firebase Hostingにはチェックを入れないでください
手順2で,何やらコードが現れますが後でも見れるので一旦無視して登録を完了してください.

すると,先ほど作ったアプリケーションがコンソールのTopページに現れるはずです.
スクリーンショット 2020-01-01 17.58.55.png
そこで,そのアプリケーションをクリックし,歯車マークをおし設定画面を開いてください.
設定画面の下の方に,Firebase SDK snippetというセクションがあり,なにやらコードのようなものが書いてあると思います.
これをソースコードのしかるべき部分に書く必要があるのですが,それは後で書くとして,今はこのFirebase SDK snippetがこの手順で見れることだけ知っておいてください.

Firestoreの作成

次に,先に【表示させたいコンテンツ】をFirestoreに登録しておきましょう.
ちなみに,Firestoreでのデータの構造は,

コレクション > ドキュメント > フィールド

になっています.

  • フィールドはキーと値のセット
  • ドキュメントは複数のフィールドを持つ
  • コレクションは複数のドキュメントを持つ

という感じです.
一応,ドキュメントの中にサブコレクションという物を入れ子にすることもできますが,今回は出てきません.

では,左側のサイドバーから,Databaseというところをクリックしてください.
スクリーンショット 2020-01-01 18.07.20.png

すると,オレンジ色のヘッダーに[データベースの作成]というボタンがあるので,そこをクリックしてください.
スクリーンショット 2020-01-01 18.09.36.png
このようなポップアップが出てきますが,下のテストモードで開始をチェックし,次へを押してください.
次のポップアップのリージョンはデフォルトのままでOKです.
しばらく待つと,このような画面になります.(一部黒抜きしてます.)
スクリーンショット 2020-01-01 18.12.00.png
この画面の,[コレクションを開始]ボタンを押してください.
コレクションIDは,プロジェクト内で一意であればなんでも良いです.
今回は,profileItemsとします.
次の画面では,コレクションを追加するためのフォームが出てきます.
ここのドキュメントIDもユニークである必要がありますが,ここは自動IDで構わないでしょう.
スクリーンショット 2020-01-01 18.45.19.png
画像のように,適当にtitle, description, commentフィールドを作ってください.
同様に数回ドキュメントを追加してみてください.
このようにドキュメントが複数あればOKです.スクリーンショット 2020-01-01 18.48.01.png

これで読み取る用のデータの作成は終わりました,

プロジェクトにfirebaseを追加.

次に,Vue.jsFirebaseを操作できるように,プロジェクトにfirebaseを追加します.
プロジェクトの直下で,

npm install firebase

をしてインストールしてください.

次に,Firebaseの設定用ファイルを作成します.

touch src/firebase.js

src/firebase.jsを作り,以下の内容を書き込んでください.
//ここにFirebase SDK snippetを入れる.はまだ無視して大丈夫です.)

// Your web app's Firebase configuration

import firebase from 'firebase/app'
import 'firebase/firestore'

var firebaseConfig = {
 //ここにFirebase SDK snippetを入れる.
}
// Initialize Firebase
firebase.initializeApp(firebaseConfig)

export default firebase

さて,次は実際に

var firebaseConfig = {
 //ここにFirebase SDK snippetを入れる.
}

の部分を書き込む必要があります.
これは,Firebaseでアプリを作成の最後の部分で見たFirebase SDK snippetを使います.
先ほどFirebase SDK snippetを見たページに移動してください.
今回は,この[構成]と書かれた方にチェックして出てくるコードを使います.

スクリーンショット 2020-01-01 19.06.42.png

このページの

var firebaseConfig = {
 apiKey: /*
いろいろな項目
*/
measurementID:xxxxxxx
}

をコピペして,そのまま

var firebaseConfig = {
 //ここにFirebase SDK snippetを入れる.
}

と置換してください.

Firestoreからデータを取得する.

とりあえず,下準備が整ったので,実際にFirestoreからデータを取得してみようと思います.
前回までで作成した,src/views/page1.vueを持ちます.

<template>
  <div class="page1 container" id="page1">
    <h1>This is Page1</h1>
    <div class="card-deck row">
      <div
        v-for="(item, key) in profileItems"
        v-bind:key="key"
        class="col-xs-12 col-md-4"
      >
        <profile-item v-bind="item" />
      </div>
    </div>
  </div>
</template>

<script>
  import ProfileItem from '../components/ProfileItem.vue'
  export default {
    components: {
      ProfileItem
    },
    data() {
      return {
        profileItems: [
          { title: 'title1', description: 'description1', comment: 'comment1' },
          { title: 'title2', description: 'description2', comment: 'comment2' },
          { title: 'title3', description: 'description3', comment: 'comment3' },
          { title: 'title4', description: 'description4', comment: 'comment4' },
          { title: 'title5', description: 'description5', comment: 'comment5' },
          { title: 'title6', description: 'description6', comment: 'comment6' }
        ]
      }
    }
  }
</script>

<style scoped>
  .page1 {
    height: 1000px;
    background-color: aqua;
  }
</style>

この,profileItemsに格納されているデータを,ソースコードに直書きするのではなく.Firestoreから取得するようにします.
まずは,<script>部で,先ほど作成したfirebase.jsを読み込みます.
ついでに,profileItemsを空にしておきましょう.

<script>
  import ProfileItem from '../components/ProfileItem.vue'
  import firebase from '../firebase.js'
  export default {
    components: {
      ProfileItem
    },
    data() {
      return {
        profileItems: []
      }
    }
  }
</script>

では,実際にデータの取得処理を書いていきますがその前に公式のドキュメントへのリンクを貼っておきます.
Cloud Firestore を使ってみる
Cloud Firestore でデータを取得する

まず,操作したいコレクションを指定してコレクション操作のためのインスタンスを作る必要があります.

firebase.firestore().collection('<コレクション名>')

今回は,profileitemsという名前でコレクションを作っているので次のように書きます.

firebase.firestore().collection('profileitems')

これを,<script>部に書いて,methodsから利用できるようにしましょう.

<script>
  import ProfileItem from '../components/ProfileItem.vue'
  import firebase from '../firebase.js'
  export default {
    components: {
      ProfileItem
    },
    data() {
      return {
        profileItems: []
      }
    },
    computed: {
      tableDatabase: () => firebase.firestore().collection('profileitems')
    }
   }
</script>

これで,methodsからthis.tableDatabaseとすることでprofileitemsのデータベースにアクセスできるようになりました.

次に,profileitemsコレクションには,複数のドキュメントがあるので,それらを全て取得する方法を見てみましょう.

コレクションのすべてのドキュメントを取得する

let citiesRef = db.collection('cities');
let allCities = citiesRef.get()
  .then(snapshot => {
    snapshot.forEach(doc => {
      console.log(doc.id, '=>', doc.data());
    });
  })
  .catch(err => {
    console.log('Error getting documents', err);
  });

このように書いてますね.
ちなみに,公式ドキュメントでは既にdbが定義されていますが,これはここでいうfirebase.firestore()だと思って大丈夫です.

どうやら,

this.tableDatabase.get()

で全てのコレクションが取得でき,それらに対してforEachを回してあげれば良さそうです.

ところで,公式のドキュメントには,snapshotとかいうのが使われていますね.これは,その関数を実行した時点でのデータが格納されているようです.
さらに.docにはそれぞれのドキュメントのデータが格納され,doc.data()でそのドキュメントに格納されているフィールドが取得できそうです.

というわけで,このようなmethodがかけそうです.

methods: {
      listenData: function() {
        return new Promise(resolve => {
          resolve(
            this.tableDatabase.get().then(snapshot => {
              snapshot.forEach(doc => {
                this.profileItems.push(doc.data())
              })
            })
          )
        })
      }
    }

これで,listenData()を実行するとそれぞれのドキュメントがprofileItemsに格納されます.
listenData()は,ページの読み込み時に一回だけ実行されて欲しいので,

created() {
      this.listenData()
}

としましょう.

従って,<script>部は,以下のようになります.

<script>
  import ProfileItem from '../components/ProfileItem.vue'
  import firebase from '../firebase.js'
  export default {
    components: {
      ProfileItem
    },
    data() {
      return {
        profileItems: []
      }
    },
    computed: {
      tableDatabase: () => firebase.firestore().collection('profileitems')
    },
    methods: {
      listenData: function() {
        return new Promise(resolve => {
          resolve(
            this.tableDatabase.get().then(snapshot => {
              snapshot.forEach(doc => {
                this.profileItems.push(doc.data())
              })
            })
          )
        })
      }
    },
    created() {
      this.listenData()
    }
  }
</script>

これで,

npm run serve

をしてhttp://localhost:8080/にアクセスすると,先ほどFirestoreに登録したデータが表示されるはずです.

これで今回の作業はほとんど完成ですが,あとは先ほどのfirebase.jsをリファクタリングします.

firebase.jsって公開されてもいいの?

最初はfirebase.jsってapiKeyとか含んでるのにパブリックなrepositoryで管理するのはまずいと思い,travisCIに環境変数として登録しておいて,デプロイ時に展開されるようにしてました.

でもよく考えるとどうせgithub pagesにアクセスするときに晒されるじゃんって思ったり.そもそも公式ではhtmlにべたがきするように指示してあったり...

どうすべきか悩んでいたら
Firebase apiKey ってさらしていいの? ほんとに?
を見つけました.

一応問題ないみたいですね.

終わりに

今回の最終的なソースコードはこちら

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Nuxt.js】SEO基礎編②:超簡単解説!5分でわかるSEO

前置き

前回の続きです。
全てにおいて
https://note.com/aliz/n/nf7cfce1bb6ca
心構え
が大事になるので、ご確認を。

3-2.SEO内部対策

使いやすいサイトを作ること
ページ内の質をあげることです。
知りたい情報で検索をし、
たどり着いた先で
良質な情報が得られることが求められます!

なぜこれが重要なのかは
基礎編をご覧ください。
クローラー、インデクサ、インデックスなど

具体的な対策方法は2つ
・インデクサビリティの最適化
・クローラビリティの最適化

インデクサビリティの最適化

クローラーに適切に情報を
インデックスしてもらうために
分かりやすいサイト構造に
どのページにどの情報があるかを判別させる
具体的なポイントを下記で説明します。

大枠の構造が…
・パンくずリストの設置
・title要素の最適化
・meta要素の最適化

など
細かいpタグなどは別記事にて。

ページネーションは
サポート終了したため触れません。
複数のページ情報を
1連のまとまりのあるものと判別するために
rel=”next”とrel=”prev”を使用していました。
それを判別しなくなったということですね。
https://webmaster-ja.googleblog.com/2011/12/relnext-relprev.html

3-2-1.パンくずリストの設置?

Frame 1.png
ページ上部によくあるこれ、
クローラーが今どこにいて
どんな情報が得られるのか
判別しやすくなります?
多くても3階層くらいが良さそうです。

3-2-2.title要素の最適化

そのページの情報を簡潔に表す言葉のため非常に重要です!
・見出しタグにキーワードを入れる
 h1〜h6の中でも
 h1にはしっかりと
 検索されるキーワードを入れましょう!
 でもいくつも盛り込めないので、
 ターゲットを絞って選定?
 尚且つ、タイトルだけで内容が想定でき、
 想定通りの情報が書かれていることが◎✨
 前回の記事
 3-1-1.検索キーワードを選定
 で選定したキーワードを入れましょう。

・h1はページに1つ!
 それ以外はいくつ使用してもOKです!
 section内にh1を1つずつの場合、
 ペナルティはないけど
 原則ページに対して1つが良さそうです。

・h1〜h6の構造を守る
 h1の下にh3がきたりとかダメ

・文字数は30文字程度に
 検索表示結果で表示される字数がこれくらいだから

3-2-3.meta descriptionの最適化

ページの説明文にあたる部分です。
検索した時にタイトルの下に出るあれです。
要約文をスペニットして表示させています。
検索順位には、
あまり影響がないと言われていますが、
クリック率に影響があります。

・選定したキーワードを盛り込む
・文字数はスマホ50文字程度、PC120文字程度
ただし、
設定した文通りに
スペニットされるわけではない
というのが難しいところですね。
こちらのサイトが参考になります!
https://digital-marketing.jp/seo/what-is-a-description/#i

3-2-4.meta content="noindex"の最適化

基礎編でやった
2-2.インデックス
これをインデックスさせないことです。
これを活用して、
現在低品質なページをnoindexにし、
良質なページの割合を増やして
評価をあげることができます?
インデックスされているかどうかは
GoogleSearchConsoleで確認ができます?
https://search.google.com/search-console/welcome

noindexについては
ここが参考になります!
https://seolaboratory.jp/91446/

このアカウントでは
Nuxt.js、Vue.jsを誰でも分かるよう、
超簡単に解説しています??
これからも発信していくので、
ぜひフォローしてください♪

https://twitter.com/aLizlab

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Vuetify】`v-select`で任意の範囲の数字を選べるセレクトボックスサンプルコード

はじめに

Vuetifyのv-selectを使って、1歳から116歳までの年齢を選ぶことが出来るサンプルコードを作成しました。

環境

OS: macOS Catalina 10.15.1
Vue: 2.6.10
vue-cli: 4.1.1
vuetify: 2.1.0

出力

image.png

image.png

コード

sample.vue
<template>
  <v-select
    v-model="age"
    :items="items"
    label="年齢"
  ></v-select>
</template>

<script>
  const maxAge = 117; //表示したい数字より+1で設定。
  const ageRange = [...Array(maxAge).keys()]

  export default {
    data() {
      return {
        items: ageRange,
          age: '',
        },
      }
    },
  }
</script>

さすがに
[1,2,3,4,...117]
とはしたくなかったのでやり方を調べたら、
[...Array(数字).keys()]で整数の連番が作成できるんですね。勉強になりました。:thinking:

Rubyなら範囲オブジェクトで0..100でOKなんですけどひと手間いりますね:sweat_smile:

おわりに

最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

参考にさせて頂いたサイト(いつもありがとうございます)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vue の忘れがちな事のメモ

値の変更をトリガーにしてタイマーセットする

値の変更を検知してタイマーセットする。
v-on などのイベントによらず、値変更がトリガーになるので適用範囲が広がる。

clearInterval を使ってリセットしないと、次の実行から interval 0 になる。

var t; // timer
var timerRun; // timer status
var timerSet = new Vue({
  el: '#timer_obj',
  data: {
    message: '',
    icon: ''
  },
  methods: {
    icon_clear: function(){
      this.icon = '';
      this.message = '';
      timerRun = false; // done
    }
  },
  watch: {
    // triggered when changed
    icon: function(val){
      if (t && ! timerRun) {
        clearInterval(t) ; // reset interval 
      }
      if (val !== '') {
        timerRun = true;
        t = setInterval(this.icon_clear,3000); // method
      }
    }
  }
});

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者によるプログラミング学習ログ 200日目

100日チャレンジの200日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

200日目は

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Vue.js】ボタンの表示文字列を動的に変更するサンプルコード

はじめに

Vue.jsを使って動的にボタンの表示文字列を変更するサンプルコードです。

親要素→子要素のデータの受け渡しを属性propsで行う方法を取っています。

環境

OS: macOS Catalina 10.15.1
Vue: 2.6.10
vue-cli: 4.1.1
vuetify: 2.1.0

出力

image.png

同じコンポーネントを使って、文字列だけを変更しています。

コード

Wrapper.vue
<template>
  <v-row>
    <Button/>
    <v-spacer></v-spacer>
    <Button
      buttonName="サインアップ"
    />
  </v-row>
</template>

<script>
  import Button from './Button.vue'

  export default {
    name: 'Wrapper',
    components: {
      Button,
    }
  }
</script>
Button.vue
<template>
  <v-btn>
    {{ buttonName }}
  </v-btn>
</template>

<script>
  export default {
    name: 'Button',
    props: {
      'buttonName': {
        type: String,
        default: 'ログイン'
      }
    }
  }
</script>

buttonNamedefault: 'ログイン'を指定しているため、Wrapper.vue側ではbuttonName="サインアップ"だけ指定しています。

おわりに

最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む