vue.js | さゆフィクション http://it.kensan.net/it aws wordpress などなどゆるーく書いてます Sat, 12 Oct 2024 03:34:10 +0000 ja hourly 1 https://wordpress.org/?v=6.5.2 https://it.kensan.net/wp-content/uploads/2023/03/cropped-icon-32x32.png vue.js | さゆフィクション http://it.kensan.net/it 32 32 vue.jsでAdmin LTEコンポーネントを使って爆速で画面開発する https://it.kensan.net/vue-js-admin-lte.html Sat, 12 Oct 2024 02:42:19 +0000 https://it.kensan.net/?p=2153 vue.jsでAdmin LTEコンポーネントを使ってみます。

Admin LTEコンポーネントを使わせてもらった方が効率的だよね?という考えです。

開発環境は構築済みのものとして進めますので、まだの場合は以下URLを参考にしてくださいー

 

 

vue.jsをDockerコンテナ上でローカル開発できるようにする
vue.jsをDockerコンテナ上でローカル開発できるようにしてみます! 以下の流れで進めていきます docker-compose.yml作成 Dockerfile作成 コンテナ起動 コンテナ内でvueプロジェクト作成 サーバ起動 では早...

 

vue.jsでAdmin LTEコンポーネントを使う

Admin LTEのインストールをする

vue.jsのプロジェクトにAdmin LTEをインストールします。

以下のコマンドを実行すればOKです。

npm install admin-lte@^3.2 bootstrap jquery popper.js -save

ソースコードを修正する

ソースコードを修正して、Admin LTEを使ってみます。

main.jsの修正

以下のように修正します。こちらは共通設定のため、初回の1回のみ必要な修正です。

<ファイル名>

main.js

<ファイルの中身>


import { createApp } from 'vue'
import App from './App.vue'

import 'admin-lte/dist/css/adminlte.min.css';
import 'admin-lte/dist/js/adminlte.min.js';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.bundle.min.js';

createApp(App).mount('#app');

画面表示用のコード(vueファイル)を修正してAdminLTEを使ってみます

試しに以下のヘッダーを実装してみます。

Main Header Component
AdminLTE v3.2 Documentation

<ファイル名>

App.vue

<ファイルの中身>

<template>
<!-- Navbar -->
<nav class="main-header navbar navbar-expand navbar-white navbar-light">
<!-- Left navbar links -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="index3.html" class="nav-link">Home</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="#" class="nav-link">Contact</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown2" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Help
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown2">
<a class="dropdown-item" href="#">FAQ</a>
<a class="dropdown-item" href="#">Support</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Contact</a>
</div>
</li>
</ul>

<!-- SEARCH FORM -->
<form class="form-inline ml-3">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</form>

<!-- Right navbar links -->
<ul class="navbar-nav ml-auto">
<!-- Messages Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
<i class="far fa-comments"></i>
<span class="badge badge-danger navbar-badge">3</span>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
<a href="#" class="dropdown-item">
<!-- Message Start -->
<div class="media">
<img src="dist/img/user1-128x128.jpg" alt="User Avatar" class="img-size-50 mr-3 img-circle">
<div class="media-body">
<h3 class="dropdown-item-title">
Brad Diesel
<span class="float-right text-sm text-danger"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">Call me whenever you can...</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
<!-- Message End -->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<!-- Message Start -->
<div class="media">
<img src="dist/img/user8-128x128.jpg" alt="User Avatar" class="img-size-50 img-circle mr-3">
<div class="media-body">
<h3 class="dropdown-item-title">
John Pierce
<span class="float-right text-sm text-muted"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">I got your message bro</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
<!-- Message End -->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<!-- Message Start -->
<div class="media">
<img src="dist/img/user3-128x128.jpg" alt="User Avatar" class="img-size-50 img-circle mr-3">
<div class="media-body">
<h3 class="dropdown-item-title">
Nora Silvester
<span class="float-right text-sm text-warning"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">The subject goes here</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
<!-- Message End -->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer">See All Messages</a>
</div>
</li>
<!-- Notifications Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
<i class="far fa-bell"></i>
<span class="badge badge-warning navbar-badge">15</span>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
<span class="dropdown-header">15 Notifications</span>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-envelope mr-2"></i> 4 new messages
<span class="float-right text-muted text-sm">3 mins</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-users mr-2"></i> 8 friend requests
<span class="float-right text-muted text-sm">12 hours</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-file mr-2"></i> 3 new reports
<span class="float-right text-muted text-sm">2 days</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer">See All Notifications</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#" role="button"><i
class="fas fa-th-large"></i></a>
</li>
</ul>
</nav>
<!-- /.navbar -->

</template>

<script>

export default {
name: 'App'
}
</script>

動作確認する

以下のようなヘッダーが表示されれば成功です。

 

まとめ

vue.jsでAdmin LTEコンポーネントが使えました!!

これから頑張って開発していきますーー

]]>
vue.jsをDockerコンテナ上でローカル開発できるようにする https://it.kensan.net/vue-local-container.html Sat, 12 Oct 2024 01:47:45 +0000 https://it.kensan.net/?p=2147 vue.jsをDockerコンテナ上でローカル開発できるようにしてみます!

以下の流れで進めていきます

  1. docker-compose.yml作成
  2. Dockerfile作成
  3. コンテナ起動
  4. コンテナ内でvueプロジェクト作成
  5. サーバ起動

では早速やってみます!

 

 

vue.jsのローカル開発環境構築

docker-compose.ymlファイル作成

 

<ファイル名>

docker-compose.yml

<ファイルの中身>


services:
  web:
    build: .
    image: vueweb
    volumes:
      - .:/app
    container_name: 'web'
    ports:
      - '8080:8080'
    tty: true

Dockerfile作成

<ファイル名>

Dockerfile

<ファイルの中身>


FROM node:22
RUN npm install -g @vue/cli
EXPOSE 8080

コンテナ起動

以下のコマンドでコンテナを立ちあげます

docker-compose up --build

コンテナ内でプロジェクト作成します

まず以下のコマンドでコンテナの中に入ります。

docker-compose exec web bash

次に以下のコマンドでプロジェクトを作成します。

vue create sample

サーバ起動

以下のコマンドでサーバ起動します。

cd sample && npm run serve

動作確認

以下のURLにブラウザからアクセスして画面表示されればOKです!

http://localhost:8080/

以下のような画面が表示されるはずですー

 

docker-compose.ymlの微調整

vueがコンテナ上で正常に動くようになりましたが、このままですと、コンテナ起動のたびにコンテナ内で「cd sample && npm run serve」を実行する必要があります。

これは面倒なので以下のように、docker-compose.ymlに「cd sample && npm run serve」を追加して、コンテナ起動時にサーバ起動するようにします。

修正後のファイルは以下のようになります。

<ファイル名>

docker-compose.yml

<ファイルの中身>


services:
  web:
    build: .
    image: vueweb
    volumes:
      - .:/app
    command: sh -c "cd sample && npm run serve"
    container_name: 'web'
    ports:
      - '8080:8080'
    tty: true

 

まとめ

vue.jsのローカル開発環境構築をして、vue.jsをコンテナ上で動かしてみました。

ここから本格的にvue.jsの開発をしていきます!!

]]>
Vue.jsのバージョン3でVue Routerを使用して画面を新規作成する(複数画面構成にする) https://it.kensan.net/vue-js_version3_vue-router.html Thu, 10 Oct 2024 05:19:58 +0000 http://13.231.168.135/it/?p=2136 Vue.jsのバージョン3でVue Routerを使用して画面を新規作成してみます。

Vueのインストールからはじめます!

 

 

Vueインストール

以下のコマンドでインストールします。

npm install -g @vue/cli

次にプロジェクト作成します。

プロジェクト作成

以下のコマンドで「sample」というプロジェクトを作成します。

vue create sample

→上記コマンド実行時の設定については以下を参照

  1. 「Manually select features」を選択してエンター
  2. 組み込むモジュールの選択が求められるので、「Router」にチェックを追加してエンター
  3. バージョン選択が求められるので「3.x」を選択してエンター
  4. そのほかはお好みの設定をしてプロジェクト作成

サーバ起動

以下のコマンドで、プロジェクト直下に移動してサーバ起動

 cd sample

 npm run serve

動作確認

以下のURLで画面表示の確認をします。

http://localhost:8080/ 

問題なく表示されればOKです。

次に画面を追加してみます

画面を追加してみる

フォルダ構成

ざっくり以下の構成になっていて「src/views」と「src/router」配下のファイルを追加・修正することで画面を追加できます。

src/views

→viewファイル格納フォルダ

→配下のテンプレート修正で画面の見た目を修正できる

src/router

→配下のindex.jsでルーティングを追加・変更可能

src/viewsにテンプレートファイルを追加

<ファイル名>

TestView.vue
<ファイルの中身>
<template>
<div class="about">
<h1>This is an test</h1>
</div>
</template>

src/routerにルーティングを追加

<修正するファイル名>

index.js

<修正内容>

以下のように、routesの定義にtestのビューへのルートを追加します。


const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    component: () => import( '../views/AboutView.vue')
  },
  {
    path: '/test',
    name: 'test',
    component: () => import('../views/TestView.vue')
  }
]

src/App.vueに新しい画面へのリンクを追加する

<修正するファイル>

src/App.vue

<修正内容>

以下のようにテストページへのリンクを追加します。

<template>
<nav>
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link> |
<router-link to="/test">Test</router-link>
</nav>
<router-view/>
</template>

動作確認

以下のURLで画面表示の確認をします。

http://localhost:8080/ 

以下のような画面が表示されれば成功です!

まとめ

Vue.jsのバージョン3でVue Routerを使用して画面を新規作成してみました。

意外と簡単に作成できましたが、画面の作り込みは大変そうだな〜〜

]]>
vue.jsでテキストボックスの内容を強制更新したい場合は「$forceUpdate」を使う https://it.kensan.net/vuejs%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e5%86%85%e5%ae%b9%e3%82%92%e6%9b%b8%e3%81%8d%e6%8f%9b%e3%81%88%e3%81%9f%e3%81%84%e3%81%aa%e3%81%a9%e5%bc%b7.html Sat, 11 Apr 2020 03:07:05 +0000 https://verdy-it.xyz/itblog/?p=134 vue.jsでテキストボックスに入力された値が不正であった場合に、入力値を無視してテキストボックスをカラにしようとしたが、これがなかなか上手くいかなかった。

具体的には、数値を入れるとこに日本語が入れられた場合は、日本語を無視してテキストボックスをカラで更新するみたいな処理がうまく動作しませんでした。

挙動を見るとカラでの更新が上手く行ったり行かなかったり不安定な挙動。。。

そんなときは「$forceUpdate」を使用したら確実に更新できる!ということがわかりました!

「$forceUpdate」にたどり着くまでに半日くらいかかりました。

$forceUpdateについて公式ページに、以下の記載があります。

Vue インスタンスに再描画を強制します。インスタンス自身と slot コンテンツに挿入された子コンポーネントだけで、全ての子コンポーネントに影響しないことに注意してください。

API — Vue.js
Vue.js - The Progressive JavaScript Framework

$forceUpdateを使うと、強制的に再描画できるということですね!

]]>
コピペでできるLaravel + Vue.js + TypeScriptなMacのローカル開発環境 https://it.kensan.net/laravel-vue-js-typescript.html Fri, 20 Mar 2020 06:14:13 +0000 https://verdy-it.xyz/itblog/?p=112 Laravel + Vue.js + TypeScriptでローカル開発環境を作っていきます。

Laravel + Vue.jsの環境構築は構築は色んなことに情報があると思うので、

より安全な開発を行うことができるTypeScriptを導入したバージョンの環境構築について記載していきます。

コピペでできるのでお試しください。

インストール&プロジェクト作成

composer create-project laravel/laravel --prefer-dist sample_app
cd sample_app
yarn install
npm i -D vue
npm install vue-template-compiler --save-dev
npm install --save vue-property-decorator

環境設定

tsconfig.jsonを追加

{
  "compilerOptions": {
    "outDir": "./built/",
    "sourceMap": true,
    "strict": true,
    "noImplicitReturns": true,
    "noImplicitAny": true,
    "module": "es2015",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "moduleResolution": "node",
    "target": "es5",
    "lib": [
      "es2016",
      "dom"
    ]
  },
  "include": [
    "resources/assets/ts/**/*"
  ]
}

vue.shims.d.ts

declare module "*.vue" {
  import Vue from "vue";
  export default Vue;
}

webpack.mix.js

let mix = require('laravel-mix');

mix.ts('resources/assets/ts/app.ts', 'public/js')
  .sass('resources/assets/sass/app.scss', 'public/css');

package.json(scripts内のパスのみ修正)

{
    "private": true,
    "scripts": {
        "dev": "node node_modules/cross-env/src/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "node node_modules/cross-env/src/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch-poll": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --watch-poll --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "hot": "node node_modules/cross-env/src/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
        "production": "node node_modules/cross-env/src/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    "devDependencies": {
        "axios": "^0.19",
        "cross-env": "^7.0",
        "laravel-mix": "^5.0.1",
        "lodash": "^4.17.13",
        "resolve-url-loader": "^3.1.0",
        "sass": "^1.15.2",
        "sass-loader": "^8.0.0",
        "ts-loader": "^6.2.1",
        "typescript": "^3.8.3",
        "vue": "^2.6.11",
        "vue-property-decorator": "^8.4.1",
        "vue-template-compiler": "^2.6.11"
    },
    "dependencies": {
        "webpack": "^4.42.0"
    }
}

 

resources/assets/sass/app.scss

とりあえず空ファイル作成

resources/views/welcome.blade.php

<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="csrf-token" content="{{ csrf_token() }}">
  <title>Laravel</title>
  <link rel="stylesheet" href="/css/app.css">
</head>
<body>
<main>
  <div id="app"></div>
</main>
<script src="/js/app.js"></script>
</body>
</html>

resources/assets/ts/app.ts

import Vue from 'vue';
import bootstrap from './bootstrap';
import AppComponent from './components/App.vue';

bootstrap();

const app = new Vue({
  el: '#app',
  render: h => h(AppComponent)
});

resources/assets/ts/bootstrap.ts

import Axios, { AxiosStatic } from 'axios';

declare global {
  interface Window {
    axios: AxiosStatic;
  }
  interface Element {
    content: string;
  }
}

export default function bootstrap() {

  window.axios = Axios;

  window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

  let token = document.head.querySelector('meta[name="csrf-token"]');

  if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
  } else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
  }

}

resources/assets/ts/components/App.vue

<template>
  <div class="App">
    <div class="container">
      <div class="row">
        <div class="col-md-8 col-md-offset-2">
          <h1>{{ message }}</h1>
        </div>
      </div>
    </div>
  </div>
</template>

<script lang="ts">
  import { Vue, Component } from 'vue-property-decorator';

  @Component
  export default class App extends Vue {
    message = 'Laravel + Vue.js + TypeScript';
  }
</script>

<style scoped>
  h1 {
    text-align: center;
    margin: 4rem 0;
  }
</style>

実行

ターミナルを2つ起動し、それぞれのターミナルで下記のコマンドを打ち込む。

こうする事で、TypeScriptは自動的にコンパイルされる。

npm run watch
php artisan serve

 

]]>