Dynamic Form Fields

Add and remove input rows dynamically using data-list for form arrays.

Live Demo

Source

HTML + JavaScript
<div data-component="dynamic-form">
    <div data-list="members">
        <template>
            <div style="display: flex; gap: 0.5rem;">
                <input data-model="memberName" data-model-trim>
                <input type="email" data-model="memberEmail">
                <select data-model="memberRole">
                    <option value="member">Member</option>
                    <option value="lead">Lead</option>
                </select>
                <button data-action="removeMember">&#10005;</button>
            </div>
        </template>
    </div>
    <button data-action="addMember">+ Add Member</button>
</div>

<script>
wildflower.component('dynamic-form', {
    state: {
        members: [
            { memberName: 'Alice', memberEmail: 'alice@example.com', memberRole: 'lead' },
            { memberName: 'Bob', memberEmail: 'bob@example.com', memberRole: 'member' }
        ]
    },
    computed: {
        summary() {
            const leads = this.members.filter(m => m.memberRole === 'lead').length;
            return this.members.length + ' members, ' + leads + ' leads';
        }
    },
    addMember() {
        this.members.push({ memberName: '', memberEmail: '', memberRole: 'member' });
    },
    removeMember(e, el, { index }) {
        this.members.splice(index, 1);
    }
});
</script>

Key Points

  • data-list works naturally for form arrays. Each row is a list item with its own data-model bindings
  • data-model="memberName" inside the template binds to each item's property, two-way per row
  • Add rows with push(), remove with splice(index, 1). Standard array operations
  • Computed summary reacts to any change across all rows (additions, removals, role changes)