Vue: カスタムvモデル修食子を远加する

䜜成日 2016幎09月13日  Â·  52コメント  Â·  ゜ヌス: vuejs/vue

.lazy 、 .number 、 .trimがあり、 .undefが進行䞭です。

.lazyを陀けば、それらはすべお双方向フィルタヌのように機胜したす。

2.0は2りェむフィルタヌをサポヌトしおいないため、同じニヌズを満たすためにカスタムvモデル修食子を远加するための新しいAPIが必芁になる堎合がありたす。

feature request

最も参考になるコメント

この問題を再開できる可胜性はありたすか 私の䞀般的な䜿甚䟋は、入力時にフィヌルドのデヌタを自動的にフォヌマットする必芁があるこずです。「101216」を取埗しお「10/12/16」に倉換するようなものです。 カスタムv-model修食子を䜜成できるず、小道具やむベントを䜿甚しおカスタム入力コンポヌネントを䜜成する代わりにv-model.dateを蚘述できるため、コヌドが倧幅に簡玠化されたす。

党おのコメント52件

@posvaで蚈算されたプロパティは再利甚できたせん。

ほずんどすべおがミックスむンを介しお再利甚可胜です。
ミックスむンを生成する関数を䜿甚できたす。 このようにしお、
動的に蚈算されたプロパティ。 私は今その䟋をフィドルに眮くこずはできたせん
しかし、私はそれをできるだけ早くしたす。
ただし、入力が持぀非垞に䞀般的なナヌスケヌスであるこずに同意したす
適甚された倉換。 適切なAPIたたは少なくずも
ガむドが必芁です

2016幎9月13日火曜日、1848FranciscoLourenço、 notifications @ github.com
曞きたした

@posvahttps ://github.com/posva蚈算されたプロパティは再利甚できたせん。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/vuejs/vue/issues/3666#issuecomment -246746524、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AAoicf33lCvETQc9LBQ5GGZ93ExPcLS_ks5qptPegaJpZM4J7vQ0
。

ほずんどすべおがミックスむンを介しお再利甚可胜です。
ミックスむンを生成する関数を䜿甚できたす。 このようにしお、
動的に蚈算されたプロパティ。 私は今その䟋をフィドルに眮くこずはできたせん
しかし、私はそれをできるだけ早くしたす。
ただし、入力が持぀非垞に䞀般的なナヌスケヌスであるこずに同意したす
適甚された倉換。 適切なAPIたたは少なくずも
ガむドが必芁です

蚀い換えるず、蚈算されたプロパティは再利甚できたせん。 回避策ずしおファクトリ関数ずミックスむンを䜿甚できたすが、䜿いやすさず読みやすさは比范できたせん。

私のプロゞェクトでは、この機胜が非垞に必芁だったため、掚奚されるカスタム入力アプロヌチを䜿甚したした。

InputCustom.js

define(function () {
  return Vue.extend({
    data: function () {
      return {
        focused: false
      };
    },
    template: '<input @focus="onFocus" @blur="onBlur" @input="onInput" @change="setDisplayValue">',
    props: ['value'],
    watch: {
      value: function () {
        if (!this.focused) {
          this.setDisplayValue();
        }
      }
    },
    mounted: function () {
      this.setDisplayValue();
    },
    methods: {
      onInput: function () {
        this.$emit('input', this.parse(this.$el.value));
      },
      onFocus: function () {
        this.focused = true;
      },
      onBlur: function () {
        this.focused = false;
        this.setDisplayValue();
      },
      setDisplayValue: function () {
        this.$el.value = this.format(this.value);
      }
    }
  });
});

InputText.js

define(['js/InputCustom'], function (InputCustom) {
  return InputCustom.extend({
    methods: {
      parse: function (val) {
        val = val.trim();
        return val === '' ? null : val;
      },
      format: function (val) {
        return val === null ? '' : val;
      }
    }
  });
});

私の意芋では、このアプロヌチは非垞に䟿利であり、 .lazyを含むvモデル修食子をたったく䜿甚しないこずにしたした。

組み蟌みの修食子がサポヌトできない、よりカスタマむズされたナヌスケヌスの堎合、 @ecmelが蚀及したのが掚奚されるアプロヌチです。 これに぀いおは、公匏ガむドで詳しく説明したす。

この機胜提案のアむデアは、既存のv-modelディレクティブを利甚するこずです。これは、すべおのinput芁玠ですでに機胜しおいたす。 すべおのプロゞェクトで_InputCustom.js_を䜜成する䜜業を節玄するには、これはすでにv-modelで行われおいるため、カスタム修食子に_InputText.js_に盞圓するものを䜜成するだけで枈みたす。これには、必芁なすべおのロゞックが含たれおいたす。ほずんどの堎合倉曎されたす。 v-modelにはすでに修食子が付属しおいるずいう事実は、それが盎感的で望たしいパタヌンであるこずを蚌明しおいたす。 カスタム修食子の䜜成を容易にし、カスタム芁玠を䜜成する䜜業を節玄し、dom/modelバむンディングを手動で実装する必芁があるのは圓然のこずです。

APIの芳点から理にかなっおいる堎合は、この機胜を実装しないずいう決定を掚進しおいる技術的な制限が䜕であるかを知るこずは興味深いでしょう。

この問題を再開できる可胜性はありたすか 私の䞀般的な䜿甚䟋は、入力時にフィヌルドのデヌタを自動的にフォヌマットする必芁があるこずです。「101216」を取埗しお「10/12/16」に倉換するようなものです。 カスタムv-model修食子を䜜成できるず、小道具やむベントを䜿甚しおカスタム入力コンポヌネントを䜜成する代わりにv-model.dateを蚘述できるため、コヌドが倧幅に簡玠化されたす。

私のプロゞェクトでしばらくvuejsを䜿甚した埌、この問題は実際に再開する必芁があるず思いたす。

少なくずも、 undef修食子が必芁です。

この問題を再開する必芁があるこずに同意したす。 undefが䜕をするのかわかりたせんが、入力のトリミングされた倀が空の文字列の堎合に倉数をnullに蚭定するv-model修食子が必芁です。

自分で簡単にできるようになりたいです。

これよりも冗長な機胜が、たずえばhttps://github.com/vuejs/vue/issues/5194で远加されたした。 倖郚から芋るず、Vueは、反応コミュニティによっお掚進されおいる慣習や慣行を支持しお、その原則のいく぀かをゆっくりず劥協しおいるように芋えたす。 そもそも目立぀品質から少し倖れおいたす。 これが、反応からの移行を容易にするこずを目的ずした意識的な決定なのか、それずも単なる偶然なのかを知るこずは興味深いでしょう。

カスタムコンポヌネントの䜜成は問題ありたせんが、 https//github.com/text-mask/text-mask/tree/master/vue#readmeなどのサヌドパヌティのカスタムコンポヌネントを䜿甚する堎合、マスクされたものをサニタむズする簡単な方法はありたせん。蚈算されたプロパティを䜿甚する堎合を陀いお、モデル倀ぞの入力。

それで、HTML暙準のinput [type = date]フィヌルドを䜿甚しおモデルの日付型を線集したいのですが、この玠晎らしく匷力で拡匵可胜なフレヌムワヌクでは、すぐにそれを行うこずはできたせんか フィヌルドに日付を読み蟌めたせん。日付を遞択した埌、デヌタ内の文字列で日付を䞊曞きしおください。 この゜リュヌションは、双方向フィルタヌたたは修食子を䜿甚しお2行で蚘述できたす。

しかし、最善の解決策は、チェックボックスやその他の暙準入力フィヌルドの堎合ず同じように、ネむティブでサポヌトするこずです。なぜ「日付」が特別なのですか

カスタム修食子の堎合は+1。 そうしない正圓な理由がない限り、簡単なこずのように思えたすか

入力をマスキングし、アプリケヌションで䜿甚するために倀を解析するこずは非垞に䞀般的な方法であり、v-model.lazy.currency="amount"のような「シンタティックシュガヌ」を䜜成するこずは玠晎らしいこずです。

カスタム修食子の堎合は1+。
文字列に評䟡されるtrue|false倀を持぀単玔なラゞオ入力がありたす-しかし、ブヌル倀ずしおそれらが必芁です-この堎合、すべおのラゞオ入力に察しお蚈算されたプロパティを再実装する必芁があるため、蚈算されたプロパティはスマヌトではありたせん。 たずえば、100個の無線入力があるず、100個の蚈算されたプロパティになりたす

カスタム修食子の堎合は+1ですが、tobeiに同意したす--input [type=date]は自動的に機胜するはずです。

カスタム修食子の堎合は+1。

私はAngularのバックグラりンドから来お、vueから始めお、このスレッドを芋たした。

VueでもAngularのパヌサヌやフォヌマッタヌのようなものを持っおいるず本圓に圹立぀ず思いたす。 v-model.dateFormatのようなこずをしお、mm / dd / yyyyのような結果が埗られれば、それは本圓に玠晎らしいこずです。

線集 @restored18が蚀ったこずを繰り返したようです。 あなたにも+1

カスタムvモデル修食子の堎合は+1。

私の堎合、JSONで取埗されたいく぀かのネストされたオブゞェクトをルヌプし、オブゞェクトごずのテンプレヌトではなく単䞀のHTMLテンプレヌトを䜿甚したす。 この堎合、蚈算されたプロパティは機胜しないず思いたすか

私は珟圚、デヌタをフェッチおよび送信するずきにサヌバヌ圢匏ずvモデル圢匏の間にカスタム倉換メ゜ッドを入れおいたすが、関数を枡すこずができる「組み蟌み」のものが欲しいです。

これに+1。 2.2より前に利甚可胜でした。 あなたは、を介しおプロパティにアクセスするこずができたす、

this.$vnode.data.directives

カスタムモデルの入力倀が远加されお削陀されたしたが、非垞に䟿利な機胜であり、フレヌムワヌクに戻す必芁がありたす。

このために+1。

カスタムvモデル修食子は玠晎らしいでしょう

私もです

2018幎も+1...

+1私の意芋ではDRYコヌドに必芁な機胜です。 今のずころ、入力の倚いフォヌムに察しお同じこずを行うりォッチャヌを10個䜜成する必芁がありたす。 カスタム修食子はすべおを解決したす。

+1私はvueを始めたばかりで、すでにこれらのタむプの双方向フィルタヌが必芁です...

+1は間違いなく必芁です

+1

ほずんどのナヌスケヌスIMOに察しお、このようなヘルパヌを構築できたす

@nickmessingは、ここで説明されおいる本圓に䟿利なナヌスケヌスをカバヌしおいたせん。これは、入力テキストのむンプレヌス倉曎です。 垞に電話のようにフォヌマットしたい入力ボックスがある堎合は、 <input v-model.phone="some_data">になりたす。 ナヌザヌがテキストを入力するず、自動的にフォヌマットされたす。

これはそのような基本的な機胜のようであり、珟圚あるべきよりも難しいです。 この動䜜はフレヌムワヌクにすでに存圚したすが、䜕らかの理由でフレヌムワヌクのみのコヌドに制限されおいたす。 これを行うカスタム修食子を远加できるようにしたいず考えおいたす。これは、珟圚のフィルタヌやディレクティブず同じように、コンポヌネントやプロゞェクト間で再利甚できたす。

@bbughは完党に同意したす、私はIBANをフォヌマットするこずで同様のケヌスを持っおいたす、そしおそれは単にそこにv-model.iban="payment.iban"を入れるためのずおも玠晎らしくお退屈な方法でしょう...

@franciscolourencoおそらく誰かが、これがフレヌムワヌクによっおサポヌトされるべきではない理由を背埌に眮いお、それがより明癜になるようにするこずができたす。

カスタム修食子の+1、この機胜で達成できるナヌスケヌスはたくさんありたす

私たちのアプリケヌションでは、通貚をフォヌマットするためのいく぀かの異なる入力があり、垞にセントの金額をモデルに栌玍したすが、入力には適切にフォヌマットされたドルの金額を衚瀺したすしたがっお、モデルの123456は$ 1,234.56ずしお衚瀺されたす <input v-model.dollars="cents" />

他のナヌスケヌスは、XSS攻撃を防ぐためにhtmlフィヌルドをサニタむズしお゚スケヌプ解陀するこずですモデルは「 A &amp; B 」を栌玍し、入力は「 A & B 」を瀺したす <input v-model.html="text" />

+1

+1

カスタム修食子の堎合は+1。
v-model.trim.uppercase=...のようなこずができないこずに本圓に驚きたした

+1

+1

+1

+1
ネむティブのv-model入力修食子は玠晎らしい機胜です。 ここで人々が蚀及しおいるように、倚くのナヌスケヌスがありたす。 私が取り組んできたすべおのプロゞェクトには、日付ず通貚の修食子が必芁でした。

ここで問題を開く必芁がありたすか https://github.com/vuejs/rfcs

私はすでにこれを+1しおいたすが、「今」䜕かが必芁な人のためにメモを投げたいです

モディファむアの方がはるかに効率的ですが、蚈算されたゲッタヌ/セッタヌフィヌルドを持぀透過的な入力/コンポヌネントを䜿甚しお同じ効果を達成するこずができたした。

誰かがそれを必芁ずするならば、私は䟋を共有するこずができたす

この䞀芋簡単な機胜で考慮すべきこずがたくさんあるため、これを実装したせんでした。

  • 組み蟌みの修食子は、実際には、さたざたなコンパむル枈みコヌドを生成するコンパむル時のヒントです。 カスタム修食子は、別のメカニズムであるランタむム構成を䜿甚しお定矩する必芁がある可胜性がありたす。

  • ランタむム構成の堎合、これに察しおどのような皮類のAPIを公開する必芁がありたすか

  • 過去には双方向フィルタヌがありたした。 双方向倀倉換では、双方向バむンディングを安定させるために、ナヌザヌが非の打ちどころのないロゞックを実装する必芁がありたす。 そうしないず、゚ッゞケヌスでアプリ党䜓が無限ルヌプに陥るリスクがありたす。

    • .numberず.trimがある理由は、これらが実際には䞀方向の倉換でありDOM倀をコンポヌネントデヌタに同期する堎合にのみ適甚される、安定するこずが保蚌されおいるためです。
  • コンポヌネントでv-modelが䜿甚されおいる堎合、カスタム修食子はどのように動䜜する必芁がありたすか

  • カスタム修食子は、テキスト以倖の入力タむプ radio 、 checkbox 、最も重芁なのは<select>などでどのように動䜜する必芁がありたすか

これらの質問はすべお回答されおおらず、芁求が芋た目よりも耇雑になっおいたす。 これが、誰かが本圓にこの機胜を必芁ずしおいる堎合、これらすべおをカバヌする適切なRFCの良い候補になるこずに同意する理由です。 それたでは、+1を増やしおも前進したせん。

@rkingon https://github.com/vuejs/vue/issues/3666#issuecomment -249583603にはすでに䟋がありたすが、異なる/優れおいる堎合は、投皿しおください。 初心者にも䟿利です。

@Gotterbild私はそのサンプルを芋逃したしたが、Vueの新しいバヌゞョンではかなり耇雑になっおいたすこれは事前に透過的なコンポヌネントのサポヌトであった可胜性がありたす

これは私が持っおいる非垞に単玔なもので、パヌセントを10進数に倉換し぀たり、4.5-> .045、その逆も同様です「ビュヌ」倀ず「モデル」倀

<template>
    <input type="number" v-on="listeners" v-model="innerValue">
</template>

<script>

    export default {
        props: ['value'],
        computed: {
            listeners () {
                const { input, ...listeners } = this.$listeners
                return listeners
            },
            innerValue: {
                get () {
                    return (this.value) ? `${(this.value * 100)}` : ''
                },
                set (_val) {
                    const val = (_val) ? (_val / 100) : ''
                    this.$emit('input', val)
                }
            }
        }
    }

</script>

すべおのフォヌカス/ブラヌなどを再指定する必芁がないため、これは䞊蚘よりも簡単です。

@yyx990803このトピックに関するより倚くの背景情報を提䟛しおいただきありがずうございたす。

私のナヌスケヌスでは、カスタム修食子は「必芁ありたせん」。 消費者の芳点からは、vueに独自の方法を構築する方法があるこずは理にかなっおいたす。 基本的に、修食子を陀いおすべおにそれがありたす😄

倉換ロゞックを適切にカプセル化し、再利甚できるものを䜜成する方法を芋぀けるこずはできたしたが、そのようなナヌスケヌスに適切なAPIを䜿甚するこずで、「ベスト-緎習修食子」。

文字列を倧文字に倉換する修食子を䜜成しようずしおいたので、ここに来たした
v-model.uppercase="username"のように䜜りたかった

カスタムディレクティブを䜿甚するこずになりたした

Vue.directive('uppercase', {
    update (el) {
        el.value = el.value.toUpperCase()
    },
})

<input type="text" v-model="username" v-uppercase>

代替手段ずしおは、カスタムディレクティブで十分です。
たたは、カスタムvモデル修食子でのみ可胜なこずはありたすか

@Christhofernataliusは、 v-modelが単なるディレクティブであるず考えおいたすが、カスタムディレクティブを優先しお、 v-modelを削陀できたせんでしたか このようにあなたは二床曎新しおいたせんか

@Christhofernataliusは、 v-modelが単なるディレクティブであるず考えおいたすが、カスタムディレクティブを優先しお、 v-modelを削陀できたせんでしたか このようにあなたは二床曎新しおいたせんか

@rkingon 2回曎新されおいたすか
したがっお、v-modelを䜿甚しない堎合は、入力リスナヌのバむンドフックずバむンド解陀フックも远加し、ナヌザヌ名の倀を曎新する必芁がありたすか

線集setterずgetterで蚈算されたものも2回曎新されおいたせんか
線集2りォッチャヌずディレクティブのコン゜ヌルログを詊したした。それぞれがキヌストロヌクごずに1回だけ出力されたす。

私はそれを詊しおいたせん、ただ掚枬です-1぀の倀を曎新する2぀のディレクティブのアむデアは私には少し面癜いず思うかもしれたせんが、あなたがそれをチェックした堎合、私はそれで䜕も悪いこずはわかりたせん。

私のコンポヌネントの回避策にも制限がありたす。そのため、モディファむアを匕き続き䜿甚しおいたす。぀たり、芁玠が必芁で、レンダリング時間が長くなり、そのコンポヌネントの定矩方法぀たり、入力フィヌルドでのみコンポヌネントずしお機胜したす。 vsディレクティブの力である任意のコンポヌネント/芁玠でそれを単玔に䜿甚するこずさえできたす。

猫の皮を剥ぐ2぀の方法、オプションがあるずいいですね:)

このためのRFCはありたすか

私はそうは思わない

私はそれを䜜成するこずができたしたが、それは単にそのRFCリポゞトリたたは䜕か他のものに問題を远加するこずを意味したすか

https://github.com/vuejs/rfcs#what -the-process-これはあなたの質問に答えたすか

これを再開できたすか カスタムディレクティブが機胜する堎合もありたすが、動䜜がおかしい堎合がありたす。䟋

Vue.directive('number', {
  update: function(el, binding, vnode) {
    el.value = el.value.replace(/[^\d.]/g, '');
  },
});

このディレクティブをvモデルずずもに远加し、1぀おきのキヌストロヌクで文字を非垞に速く入力するず、 v-modelはel.valueず同期しなくなりたす。 たた、受け取ったバむンディングオブゞェクトを倉曎できないため、このディレクティブ内でv-modelを「再実装」する方法はありたせん。

@jeankvdやり過ぎのように感じるこずはわかっおいたすが、ラッパヌコンポヌネントが最も信頌性が高くなりたす䞊蚘の䟋を参照。

ラッパヌコンポヌネントを䜿甚するず、「さらに倚くのこずを実行」するこずもできたす。 「数倀」の䟋では、理想的には、vモデルは実際にはNumberになりたす。 あなたのアプロヌチでは、それはただStringです。

空の倀をカスタマむズしたい堎合はどうなりたすか 空の文字列 ヌル 未定矩 -- emptyValueの小道具を枡しお、そのように蚭定できたす。

か぀おはこれを支持しおいたしたが、モディファむアには制限が倚すぎお、コンポヌネントを持っおいるだけではるかに優れおいるこずに気づきたした少なくずもimo。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡