2020
03/11

クリックしたら編集できるようになるテキストを実装する(元データが配列の場合)

Vue.jsのプロジェクトで「クリックしたら編集可能となり、入力値がdataに反映される」という処理を実装する必要がありましたので方法を考えました。

DEMO

ADs

データが単体の場合

扱うデータが一つだけで独立している場合は簡単です。

divをクリックされたらフラグ(ここではedit)をtrueにし、v-ifで非表示状態となっていたinputが表示されるという仕組みです。inputからフォーカスが外れるとeditがfalseとなり、inputは非表示、divが表示となります。
input表示後フォーカスを当てるためにカスタムディレクティブを使用しています。

と、これだけなら簡単ですが、ここまでシンプルになることはあまりありません。

データが配列の場合の方法1:配列にチェック用データを足す

「クリックすると編集できる」という処理が求められる場合、対象が単一のデータであるケースはほとんどないと思います。
現実的には配列を受け取ってv-forで一覧にし、そのデータを書き換えられるようにする、という使い方が多いのではないでしょうか。

そのような場合、配列に編集状態を判定する値を追加し、その追加した値をフラグとして編集状態の判定をします。

たとえば以下のような配列があったとして

編集フラグとなる値(ここではvalueChecker)を追加します。

この配列への追加処理はlodashを使うと簡単です。
createdで_.cloneDeepWithを使い、valueCheckerという値を追加します。

あとは項目が単独だったときと同様に、valueCheckerのtrue/falseによってdivを表示するかinputを表示するかを分岐します。

全体のコードは以下のようになります。

データが配列の場合の方法2:配列をまるごと複製し、フラグ用に使う

さらに実践的な例を考えてみます。
最も頻繁に扱うことになる配列は以下のようにkey:valueが複数組含まれる配列でしょう。商品データやユーザーリスト考えられます。

この場合、各配列にフラグを足すのもいいですが、配列を丸ごと複製し、値をtrue/falseとすることで編集状態を管理する方法を考えました。

再び_.cloneDeepWithを使い、値をすべてfalseにした新しい配列を生成します。

HTML部分はdivをクリックした際にindexとキー名を引数にもたせ、どの要素が対象かを判定します。

クリック時の処理であるdoEditArray2はフラグ用に生成したarrayCheckerの値を書き換えるだけのものです。

実際に動作するサンプルを公開しましたのでソースや挙動などの参考にしてください。

…もうちょっとスマートな方法があるような?
今後の学習課題としましょう。

ADs

Post Comments

メールアドレスが公開されることはありません。

Comments

コメントはまだありません。