1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Alpine.jsで動的に追加した配列要素が初期化されてしまう

Posted at

Alpinejsのx-forで配列を回してinputを表示し、button押下で要素の追加や削除するケースはよくあると思う。

html
<div x-data="{items: ['A', 'B', 'C']}">
    <template x-for="(item, index) in items">
        <div class="item">
            <input name="`item[${index}]`" x-model="item">
        </div>
    </template>
    <button type="button" @click="items.push('')">追加</button>
</div>

上記のようにすると、追加ボタンを押したときにそれまでに入力した情報は初期化されてしまう。
原因はx-modelでディレクティブしている対象がx-forで新しく代入したitemになっている点と思われる。

html
<div x-data="{items: ['A', 'B', 'C']}">
    <template x-for="(item, index) in items">
        <div class="item">
            <input name="`item[${index}]`" x-model="items[index]">
        </div>
    </template>
    <button type="button" @click="items.push('')">追加</button>
</div>

itemsにindexを渡すことで正しく親のデータが書き換えられ、pushで追加したときもそれまでのデータが保持されるようになる。

以上備忘録。(数時間苦しんだ)

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?