Vueダイナミックフォームの詳細な応用

Vueダイナミックフォームの詳細な応用

概要

バックグラウンド管理システムには多くのフォーム要件があります。データをjson 形式で書き込み、vue ループを通じて動的フォームを動的にレンダリングできるようになることを期待しています。また、レンダリングされたフォームデータを外部から取得し、ウェアハウス操作を実行することも可能である。

Vモデルを理解する

vue-model は、フォーム要素に値を渡し、外部で入力イベントをリッスンすることと同じです。したがって、フォーム コンポーネントを独自にカプセル化すると、を渡して入力イベントをリッスンし、入力値を取得することもできます。

<input type="text" v-model="もの">

<!-- 以下と同等 -->
<input type="text" v-bind:value="thing" 
       v-on:input="もの = $イベントターゲット値">

ビジネスアプリケーションシナリオ

最近、オンライン教育プラットフォームを作成していたのですが、バックグラウンドでコースを追加するときに、各コースに必要なパラメータが異なることがわかりました (一部のコースには特別なパラメータがありませんでした)。このシナリオで固定フォームを使用することはエレガントではなく、作業負荷が膨大でした。この問題を解決するために、コースを追加するときにコース分類フォームに必要なパラメータを動的に表示し、入力されたコースパラメータを取得し、データを構築し、保存操作を実行できます。

コンポーネントを通じてカテゴリを表示する

<!-- reply.vue -->
<テンプレート>
  <div>
    <li>
      <div v-if="data.id != 0" @click="getfid(data.id)" :id="data.id"> {{ data.name }}</div>
      <ul v-if="data.children && data.children.length > 0">
        <Reply v-for="child in data.children" :key="child.id" :data="child"/>
      </ul>
    </li>
  </div>
</テンプレート>

<スクリプト>

  './bus.js' からバスをインポートします。

  エクスポートデフォルト{

    //名前を宣言する name: "Reply",
    プロパティ: ['データ'],
    //コンポーネントを宣言します components: {},
    //変数data()を宣言する{
      戻る {
        フィド: 0,
      }
    },
    //カスタムフィルター フィルター: {
      myfilter: 関数 (値) {
        値 = value.slice(0, 3);
        戻り値 + "********";
      }
    },
    // 初期化メソッドmounted() {
    },
    //メソッドを宣言する methods: {
      //カテゴリーIDをクリック
      getfid: 関数 (fid) {
        _fid_ は、_fid_ の後に続くすべての要素で構成されます。
        //コンソールログ(this.fid);
        バス.$emit("msg", fid);
        localStorage.setItem("fid", this.fid);

        //すべてのハイライトをキャンセルします var divs = document.getElementsByClassName("bg");

        //セレクターをトラバースする for (var i = divs.length - 1; i >= 0; i--) {

          //ハイライトを解除 divs[i].classList.remove("bg");

        }
        //まず、現在の要素を強調表示します var mydiv = document.getElementById(fid);
        // ハイライト クラス セレクターを動的に追加します。mydiv.classList.add("bg");
      }
    }
  }
</スクリプト>


<スタイル>

  ul {
    左パディング: 10rem;
    リストスタイル: なし;
  }

  .bg {
    背景: オレンジ;
    色: 白;
  }
</スタイル>

サードパーティのコンポーネントを使用してカテゴリIDを監視する

<!--bus.js-->
'vue' から Vue をインポートします

デフォルトの新しい Vue() をエクスポートします。

コースページの追加

<テンプレート>
  <div>
    <heads></heads>
    <h1>コース提出ページ</h1>
    <返信:data="mydata"/>
    <バンセルグループ>
      <van-field label="コースタイトル" v-model="title"/>
      <van-field label="コースの説明" v-model="desc" rows="5" type="textarea"/>
      <van-field label="コース料金" v-model="price"/>

      <div v-for="(値、キー、インデックス) パラメータ内">
        <van-field :label="キー" v-model="情報[キー]"/>
      </div>

      <van-button color="gray" @click="addcourse">コースを保存</van-button>
    </バンセルグループ>
  </div>
</テンプレート>

<スクリプト>

  //他のコンポーネントをインポートするimport bus from './bus.js';
  「./reply」から返信をインポートします。
  「./heads」からヘッドをインポートします。


  エクスポートデフォルト{

    //コンポーネントを宣言: {
      「返信」: 返信、
      「ヘッド」:ヘッド、
    },
    //コンストラクタが作成されました() {
      //バスを監視します。$on('msg', target => {
        console.log(ターゲット);
        this.fid = ターゲット;
        (this.cid === 0)の場合{
          this.get_cate(this.fid)
        } それ以外 {
          this.$toast.fail("コースはすでに保存されているため、カテゴリを再度選択することはできません");
          false を返します。
        }
      });
    },
    //変数data()を宣言する{
      戻る {
        //データ mydata: {},
        //コースカテゴリID
        fid: localStorage.getItem("fid"),
        タイトル: ""、
        価格: ""、
        説明: "",
        cid: 0,
        動画: [],
        ビデオrc: "",
        パラメータ: {},
        情報: {}
      }
    },
    // 初期化メソッドmounted() {
      データを取り出します。
    },
    //メソッドを宣言する methods: {
      get_cate(fid) {
        this.axios.get('http://localhost:5000/getcate/', {params: {'fid': fid}}).then(result => {
          var myparams = result.data.params;
          if (myparams === '') {
            マイパラメータ = null
          }
          myparams = JSON.parse(myparams)
          this.params = myparams

          for (var キー in this.params) {
            this.$set(this.info, キー, '')
          }
          console.log(この情報)
        })
      },
      //コースを追加する addcourse: function () {
        var リスト = [];
        for (var key in this.info) {
          lists.push({'key': キー、'value': this.info[key]、'label': this.params[key]})
        }

        var list_str = JSON.stringify(リスト)

        var data_post = {
          fid: this.fid、
          タイトル: this.title,
          説明: this.desc,
          価格: this.price,
          id: localStorage.getItem("user_id"),
        }
        リストの長さが0より大きい場合
          データ投稿 = {
            fid: this.fid、
            タイトル: this.title,
            説明: this.desc,
            価格: this.price,
            id: localStorage.getItem("user_id"),
            パラメータ:list_str
          }
        }

        this.axios.post(
          'http://localhost:5000/addcourse/',
          this.qs.stringify(data_post)).then((結果) => {
          結果データコード === 200 の場合
            this.$toast.success('コースが正常に追加されました');
            this.cid = 結果データ.cid;
          } それ以外 {
            this.$toast.fail(結果データmsg);
          }
        });
      },
      //データを取得する get_data: function () {
        //リクエストを送信 this.axios.get(
          'http://localhost:5000/catelist/').then((結果) => {
          console.log(結果);
          //ルートノードを宣言します var mytree = {'id': 0, name: ""};
          mytree['children'] = 結果.data;
          mytree をコピーします。
          コンソールにログ出力します。
        });
      }
    }
  }
</スクリプト>


<スタイルスコープ>

  ul {
    左パディング: 10rem;
    リストスタイル: なし;
  }

</スタイル>

まとめ

簡単に言うと、コースを追加するときにカテゴリを選択すると、そのカテゴリに渡す必要があるパラメータがフォームの形式で動的に表示されるため、ユーザーはコースを追加して効率を向上させることができます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue ダイナミックフォーム開発方法事例詳細解説
  • Vueを使用して動的なフォームを生成する
  • Vue 動的フォーム検証メソッドを実装するための戦略モード
  • Vue+Element の動的フォーム、動的テーブル (バックエンドが設定を送信し、フロントエンドが動的に生成) の詳細な説明
  • Vue+elementUIをベースに動的フォーム検証機能を実装(条件に応じて検証形式を動的に切り替える)
  • Vue で動的フォームを構築する方法の例
  • Vue2 で動的なフォームの追加、削除、変更、クエリの例を実装する方法
  • Vue+ElementUIは、フォームの動的レンダリングと視覚的な構成の方法を実現します。
  • Vue+Elementは新しいフォームの動的な生成を実現し、検証機能も追加
  • フォームを動的に読み込むためのVue+要素

<<:  登録フォームのデザインルール

>>:  MySQL 5.6 の「暗黙的な変換」によりインデックスが失敗し、データが不正確になる

推薦する

VMware 仮想マシンに CentOS と Qt をインストールするチュートリアル図

VMware のインストールパッケージのインストールダウンロードアドレス: https://www....

seata docker 高可用性デプロイメントの詳細な紹介

バージョン1.4.2公式ドキュメントドッカーハブ起動する環境変数SEATA_CONFIG_NAMEを...

CN2、GIA、CIA、BGP、IPLC はどういう意味ですか?

CN2ラインとは何ですか? CN2 は、China Telecom Next Carrier Ne...

jsはショッピングサイトの虫眼鏡機能を実現します

この記事では、ショッピングサイトの虫眼鏡機能を実現するためのjsの具体的なコードを紹介します。具体的...

子要素の margin-top によって親要素が移動する問題の解決方法

問題の説明今日、ページ スタイルを変更していたときに、子要素にmargin-top設定したのに、子要...

CSS で中空効果を実装するサンプルコード

効果原理主にCSSグラデーションを使用して、切り取りを必要としない背景のくり抜きを実現します。クーポ...

Vue要素ヘッダーにスラッシュを追加するための実装コード

<テンプレート> <div class="アプリコンテナ"&...

MySQL カーソルの概念と使用法の詳細な説明

この記事では、例を使用して MySQL カーソルの概念と使用方法を説明します。ご参考までに、詳細は以...

JavaScript コンストラクタとプロトタイプの関係

目次1. コンストラクタとプロトタイプ1. コンストラクター2. コンストラクタ問題3. コンストラ...

vuex名前空間の使用

目次Vuex は単一の状態ツリーを使用するため、すべてのアプリケーション状態が比較的大きなオブジェク...

MySQL クエリのパケットが大きすぎる問題と解決策

問題の説明:エラーメッセージ:原因: com.mysql.jdbc.PacketTooBigExce...

vue.js パッケージ化プロジェクトの後の空白ページの解決策

Vueに触れたばかりのパートナーの多くは、開発環境ではVueプロジェクトは正常であるが、パッケージ化...

Linux で rsync を使用する方法

目次1. はじめに2. インストール3. 基本的な使い方3.1、-rパラメータ3.2、-aパラメータ...

Tomcatの起動が遅い問題を素早く解決、超簡単

今日、私はクラスメートが問題を解決するのを手伝いました - Tomcat の起動が非常に遅く、約 5...

CSS+JS で水滴の波紋アニメーション ボタン効果を実装するサンプル コード

コードは次のようになります。 <!DOCTYPE html> <html lang...