LoginSignup
0
0

More than 5 years have passed since last update.

vue.jsで汎用Viewを作成してみた

Posted at

DjangoのGenelic View的なものを、Vue.jsで作成してみました。

1.環境

カテゴリ バージョンなど
os windows 10 home 64bit
vue 3.2.1

2.目的

DjangoのGeneric Viewを使うと、formにmodelのカラムをいちいち書かなくても、form.as_pなどとすることでModelのカラムを展開してくれます。

form.html
<form method="POST">
{{ form.as_p }}
</form>

これをvue.jsを使って同じようなことをしてみたいと思います。

3.実装

(1)ファイル構成

dist
│  vue.min.js
sample
│  sample.html
│  vue-genericview.css
│  vue-genericview.js

(2)html

sample/index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="vue-genericview.css">
<style>
    body{
      font-size: 14px;
    }
    .container {
      min-width:20%;
      width: 98%;
      padding: 6px;
    }
</style>
</head>
<body>  
  <div class="container">
      <div id="content">
        <edit-grid 
          :data="griddata"
          >
        </edit-grid>
      </div>
  </div>
<script type="text/javascript" src="../dist/vue.min.js"></script>
<script type="text/javascript" src="./vue-genericview.js"></script>
<script>
  //mydataは実践ではaxiosなどでサーバからjsonを取得します。
  var mydata = {};
  for (var i = 0; i < 5; i++) {
    mydata["label" + i] = "value" + i
  }

  new Vue({
    el: '#content',
    data: {
        griddata : mydata
    },
  })
</script>
</body>
</html>

(3)js

コンポーネントです。props,dataだけを使います。
bootstrapなどを使う場合は、classを適時変更ください。

sample/vue-genericview.js
  Vue.component('edit-grid', {
    template: `
  <div>
    <div class="block core-block" v-for="(value, key) in data">
      <label>{{ key }}</lavel><br/> <input type="text" v-model="value" />
    </div>
  </div>
    `,
    props: {
      data: Array,
    },
    data: function () {
        var data = this.data
        return data
    },
    computed: {
    },
    filters: {
    },
    methods: {
    }
  })

(4)css

一例です。適時編集ください。

sample/vue-genericview.css
    .block {
      padding: 3px;
      display:inline-block;
    }

    .core-block {
      min-width:98%;
    }

    .full-block {
      min-width:98%;
    }

    .block * {
      width: 99%;

    }

    .block input {
      border: none;
      border: 1px solid darkgray !important;
      padding: 3px;
    }

4動作確認

image.png

まだ荒っぽいですが、とりあえず目的は達成できました。

0
0
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
0
0