- 投稿日:2020-01-01T22:50:03+09:00
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アプリケーションが読み込まれます。
- 投稿日:2020-01-01T22:00:47+09:00
アプリ音痴の両親のためにLINEで共有した写真をデジタルフォトフレーム風にするアプリを作った話
この記事はぷりぷりあぷりけーしょんず Advent Calendar 2019の22日目の記事です。
はじめに
大遅刻スミマセン。、
まさかの年越してからアドベントカレンダーに登録するという最早アドベントカレンダーとはなんぞやな状況です。
師走の風に流され、忙しさのあまり年内に完成させ記事にする予定のアプリが新年初コミットとともに完成に至る形になりました。さて、年を越したと同時にエンジニアに転職して丸3年が経ちました。
1年半ほど前は丸3年経つまでにサーバー・ネットワークの設定からアプリの開発、何かしらのサービスの一般公開をしたい
というのを目標に業務とは別に個人学習、開発を行なっていました。
結果的にサーバー・ネットワークの設定
,何かしらのサービスの一般公開
というのは叶うことはなかったわけですが個人的に家族のための使うことができる
レベルのアプリを作成することが叶いました。作ったもの
私の両親はまあアプリ音痴でインスタグラムはもちろんのこと、LINEがギリギリ使えるレベルです。その割に父親はガジェット好きでiPadはいっちょ前に4台持っています。
いっちょ前にリビングに立て掛けてあるiPadを有効活用してもらいたいと思いLINEだけで完結するデジタルフォトフレームアプリfamiphoto
(famip○rtからパクったとかは言わない)を作成しました。アーキテクチャ
ざっくり上記のようになっており、アプリのフローとしては以下の通りです。
- LINEグループにMessagingAPIで作成したbotを招待
UUIDを作成し、グループIDをキーにDynamoDBに保存、S3にUUIDのディレクトリを作成- 今まで通り画像を共有(ここ重要)
グループIDからUUIDを取得し、画像をUUIDのディレクトリに保存famiphoto url
とメッセージを送るとデジタルフォトフレームのurlを返す
urlはhttps://***firebase.app/family/{uuid}
- urlにアクセスするとデジタルフォトフレームとして起動しリビングに飾る
裏では{uuid}
をリクエストパラメータにAPIGatewayからLambdaを起動し、S3の画像URL一覧を取得してる- PWAなのでホームに落としてあげれば、普通にiPad使いたいときは普通に使ってもらい、飾っておくときはアプリを起動して置くだけで良い
使用している技術は
- AWSLambda Runtime-Go
- DynamoDB
- S3
- Firebase hosting
- Vue.js
- PWAAWS側のインフラ周りは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.gofunc 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.gotype 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つ〜2つくらい(規模によると思う)
- 今までの知識のアップデートを中心に
- 時間のかかりそうな箇所は得意分野で
- わからなそうな領域はググってコピペでいいから終わらせる
というのがアプリを作る際のモチベーション維持の要になるように思います。
今回の私のアプリでいうと
- PWA
- Go, Vue.js
- CDK, Firebase
- 画像のフルスクリーン表示やスライドショーぽくするところ
といったところでしょうか。
エンジニア丸3年経過時の目標へのコミットは残念ながら届きませんでしたが全くの未経験から相談なしにエンジニアへの転職をしてやって見せてやることはできたかと思います。(父親は令和の世を生きる人間とは思えない程固い人間)
ここまで作ることができ、あとはやる気次第だと思うので2020年のアドベントカレンダーでは一般公開したサービスの記事を書けるように変わらずマイペースに個人開発をしていきたいと思います。
参考
Vue CLI 3 で PWA チュートリアル(Service Workers / Add to Home Screen / Push Notifications)
とっても簡単!Vueでフルスクリーン機能を実装する
- 投稿日:2020-01-01T21:12:00+09:00
フロントエンド素人大学院生が爆速でVue.jsでポートフォリオを作った話【Firebaseと連携編】
始めに
明けましておめでとうございます.(執筆時:2020/1/1)
年末年始は一緒にゆっくりする友達もいないのでやったことない技術分野にチャレンジしています.
前回までの記事は
- vue cli4でプロジェクトを作ってgithub pagesに公開する + travisでCI/CD
- フロントエンド素人大学院生が爆速でVue.jsでポートフォリオを作った話
- フロントエンド素人大学院生が爆速でVue.jsでポートフォリオを作った話【Cardデザイン】
です.
最終的に作ったもの(再掲)
実際に作ったポートフォリオはこちら
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自体を初めて使う人は,登録作業が必要になるかもしれません.)
遷移した先のページで,[プロジェクトの追加]ボタンを押してください.
そして,画面の誘導にしたがってプロジェクトの作成を行ってください.無事プロジェクトが作成できたら,次のような画面になると思います,
次は,上記画面の,
</>
を押してWebアプリを追加していきます.
このとき,アプリのニックネーム
は適当に好きな名前を登録し,Firebase Hosting
にはチェックを入れないでください
手順2で,何やらコードが現れますが後でも見れるので一旦無視して登録を完了してください.すると,先ほど作ったアプリケーションがコンソールのTopページに現れるはずです.
そこで,そのアプリケーションをクリックし,歯車マークをおし設定画面を開いてください.
設定画面の下の方に,Firebase SDK snippet
というセクションがあり,なにやらコードのようなものが書いてあると思います.
これをソースコードのしかるべき部分に書く必要があるのですが,それは後で書くとして,今はこのFirebase SDK snippet
がこの手順で見れることだけ知っておいてください.Firestoreの作成
次に,先に【表示させたいコンテンツ】をFirestoreに登録しておきましょう.
ちなみに,Firestore
でのデータの構造は,コレクション > ドキュメント > フィールド
になっています.
- フィールドはキーと値のセット
- ドキュメントは複数のフィールドを持つ
- コレクションは複数のドキュメントを持つ
という感じです.
一応,ドキュメントの中にサブコレクションという物を入れ子にすることもできますが,今回は出てきません.では,左側のサイドバーから,
Database
というところをクリックしてください.
すると,オレンジ色のヘッダーに[データベースの作成]というボタンがあるので,そこをクリックしてください.
このようなポップアップが出てきますが,下のテストモードで開始
をチェックし,次へを押してください.
次のポップアップのリージョンはデフォルトのままでOKです.
しばらく待つと,このような画面になります.(一部黒抜きしてます.)
この画面の,[コレクションを開始]ボタンを押してください.
コレクションIDは,プロジェクト内で一意であればなんでも良いです.
今回は,profileItems
とします.
次の画面では,コレクションを追加するためのフォームが出てきます.
ここのドキュメントIDもユニークである必要がありますが,ここは自動IDで構わないでしょう.
画像のように,適当にtitle, description, comment
フィールドを作ってください.
同様に数回ドキュメントを追加してみてください.
このようにドキュメントが複数あればOKです.これで読み取る用のデータの作成は終わりました,
プロジェクトに
firebase
を追加.次に,
Vue.js
でFirebase
を操作できるように,プロジェクトに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
を見たページに移動してください.
今回は,この[構成]と書かれた方にチェックして出てくるコードを使います.このページの
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 ってさらしていいの? ほんとに?
を見つけました.一応問題ないみたいですね.
終わりに
今回の最終的なソースコードはこちら
- 投稿日:2020-01-01T19:01:24+09:00
【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.html3-2-1.パンくずリストの設置?
ページ上部によくあるこれ、
クローラーが今どこにいて
どんな情報が得られるのか
判別しやすくなります?
多くても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/#i3-2-4.meta content="noindex"の最適化
基礎編でやった
2-2.インデックス
これをインデックスさせないことです。
これを活用して、
現在低品質なページをnoindexにし、
良質なページの割合を増やして
評価をあげることができます?
インデックスされているかどうかは
GoogleSearchConsoleで確認ができます?
https://search.google.com/search-console/welcomenoindexについては
ここが参考になります!
https://seolaboratory.jp/91446/このアカウントでは
Nuxt.js、Vue.jsを誰でも分かるよう、
超簡単に解説しています??
これからも発信していくので、
ぜひフォローしてください♪
https://twitter.com/aLizlab
- 投稿日:2020-01-01T11:24:40+09:00
【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出力
コード
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()]
で整数の連番が作成できるんですね。勉強になりました。Rubyなら範囲オブジェクトで
0..100
でOKなんですけどひと手間いりますねおわりに
最後まで読んで頂きありがとうございました
どなたかの参考になれば幸いです
参考にさせて頂いたサイト(いつもありがとうございます)
- 投稿日:2020-01-01T10:41:16+09:00
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 } } } });
- 投稿日:2020-01-01T08:55:07+09:00
初心者によるプログラミング学習ログ 200日目
100日チャレンジの200日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
200日目は
おはようございます
— ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) December 31, 2019
200日目
udemyでcss+メディアクエリ、vue.js、webサイトコーディング
この休み中に、3つの講座やってます。2つぐらいおわりそうだから、もう1~2つぐらいやりたいな#早起きチャレンジ#駆け出しエンジニアと繋がりたい #100DaysOfCode
- 投稿日:2020-01-01T07:25:42+09:00
【Vue.js】ボタンの表示文字列を動的に変更するサンプルコード
はじめに
Vue.jsを使って動的にボタンの表示文字列を変更するサンプルコードです。
親要素→子要素のデータの受け渡しを
属性
→props
で行う方法を取っています。環境
OS: macOS Catalina 10.15.1 Vue: 2.6.10 vue-cli: 4.1.1 vuetify: 2.1.0出力
同じコンポーネントを使って、文字列だけを変更しています。
コード
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>
buttonName
にdefault: 'ログイン'
を指定しているため、Wrapper.vue
側ではbuttonName="サインアップ"
だけ指定しています。おわりに
最後まで読んで頂きありがとうございました
どなたかの参考になれば幸いです