vue.js の v-if を使った時の「Cannot read property ..... of undefined"」エラーに対処する

● vue.js の「Cannot read property ..... of undefined"」エラーに対処する

これはオブジェクトが undefined なのに、オブジェクトのメンバ変数にアクセスしようとした時によくおこります。
次のようにあらかじめ存在チェックを入れて回避しましょう。

{{ props.row.client.tel }}

  ↓ ( v-if を使って props.row.client の存在を確認する )

<span v-if="props.row.client">{{ props.row.client.tel }}</span>

● オブジェクトの中身がある場合の v-if

(例: projects の中身が3つ以上ある場合 )

<li v-if="props.row.projects.length > 2">

 ↓ エラーが出る場合はこのように書き換えます

<li v-if="props.row.projects && props.row.projects.length > 2">

参考 : https://bit.ly/2NPKyWB

No.1770
07/03 11:28

edit

vue.js で便利なフィルター

● pluck

よくある結果セットから、特定のカラムだけ取り出して配列にします。

new Vue({
  el: '#app',
  data: {
    key: 'name',
    users: [
      {id: 1, name: 'sato', age: 33},
      {id: 2, name: 'suzuki', age: 26},
      {id: 3, name: 'yamada', age: 40},
    ]
  },
  filters: {
    pluck(users, key) {
      return users.map(user => user[key])
    }
  }
})

引用 : https://iwb.jp/vuejs-custom-filter-sample-list/

また、そのままカンマ区切りで出力する場合は次のように .join(', ') します。
 

{{ props.row.tantos | pluck('name').join(', ') }}
No.1745
04/27 10:59

edit

Nuxt.js による静的サイト制作

● yarn のインストール

npm install -g yarn

● nuxt.js サイトの新規作成

プロジェクト名を mysite としています。

yarn create nuxt-app mysite

● サイトの起動

cd mysite
yarn dev

http://localhost:3000/
でサイトにアクセスできるようになります。

● ページの追加

pages ディレクトリの中に works ディレクトリを作成して 1001.vue を次の内容で保存します。

<template>
  <div>
アイウエオ
  </div>
</template>

http://localhost:3000/works/1001
でアクセスできるようになります。

● 静的サイトを htmlに書き出し

yarn generate

dist/ ディレクトリが作成されてそこに書き出されます。

No.1688
02/04 10:46

edit

vue.js で エスケープしない記法 「 v-html=メソッド() 」「v-html=パラメータ名」

● vue.js で エスケープしない記法 「v-html=メソッド名()」

<div v-html="my_calc(props.row.sum_no)"></div>

  ↑

props.row.sum_no を my_calc メソッドを通した結果を エスケープせずに表示します

● vue.js で エスケープしない記法 「v-html=パラメータ名」

<span v-html="rawHtml"></span>

  ↑

この span のコンテンツは rawHtml プロパティの値に置き換えられ、プレーンな HTML として解釈されます。
No.1463
06/30 23:16

edit

vue.js の wysiwygエディタ

● vue-html-editor

http://haixing-hu.github.io/vue-html-editor/

jQueryのsummer note の vue.js移植版

● toast-ui.vue-editor

https://github.com/nhnent/toast-ui.vue-editor

添付ファイル1
No.1399
12/21 11:04

edit

添付ファイル

vue.js レンダリング前 のテンプレートや変数を見せないようにする

・cssを作成する

[v-cloak] {
  display: none;
}

・見せたくない要素に v-cloak をつける

<div v-cloak>

これだけでレンダリング前は非表示にして、レンダリング後に自動的に表示されるようになります。

No.1340
11/01 10:31

edit

transition-groupでリストにtransitionアニメーションをつける

● transition-groupでリストでデータを作成、削除した時に、transitionアニメーションをつける

・アニメーションさせたいリスト全体を<transition-group>タグで囲います

<transition-group>
    <div v-for="v,i in data_loop" :key="v.id">
        (% v.tanto_name %)
    </div>
</transition-group>

 ↓ これはレンダリングするとこのようになります

<span>
<div>担当者A</div>
<div>担当者B</div>
<div>担当者C</div>
</span>

transition-group タグspan タグ に変わります

任意のタグにするには

<transition-group>

 ↓

<transition-group tag="div">

とします。(div タグになります)

・アニメーション用のCSSを用意する

.v-enter-active, .v-leave-active {
  transition: opacity 1s;
}
.v-enter, .v-leave-to {
  opacity: 0;
}

以上で vue.js のデータを削除した時にアニメーションがつけられます。 簡単ですね。

拡張は色々できます。

公式ドキュメント参照
https://jp.vuejs.org/v2/guide/transitions.html

No.1339
11/01 10:19

edit

Vue.js で 数字に3桁ごとにカンマをつけるフィルター「number_format」を作成する

● Vue.js でフィルターを作成する

数字に3桁ごとにカンマをつけるフィルター「number_format」を作成する

Vue.filter('number_format', function (value) {
    if (! value) { return false; }
    return value.toString().replace( /([0-9]+?)(?=(?:[0-9]{3})+$)/g , '$1,' );
});

● Vue.js で使用する

よくあるテンプレートのフィルターと同じ書き方で使えます。

{{ props.row.price_with_shipping_no|number_format }}
{{ 123456789 | number_format }}
No.1335
10/30 17:22

edit