Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

190
Views
How do show the inputs fields just for that specific iteration?

Trying to dynamically show the input fields just for a specific iteration - currently it shows the input fields for all of them. I have also prepared this stackblitz fiddle

Currently when i click ”add user to Stockholm”, all inputs fields show and all input fields are populated when I type the name of the new user.

<div
  v-for="(city, a) in cities"
  v-bind:key="city.name"
  style="margin-bottom: 30px"
>
  {{ city.name }}
  <div
    v-for="(user, b) in city.users"
    :class="[user.active ? 'green' : 'red']"
  >
    {{ user.name }} {{ b }}
    <button v-on:click="deleteUser(a, b)">Delelete</button>
    <button v-on:click="activateUser(a, b)">
      {{ user.active ? 'Unactive' : 'Active' }}
    </button>
  </div>

  <div v-if="addUser" style="margin-top: 10px">
    <input type="text" v-model="newUserName" placeholder="name" />&nbsp;
    <button v-on:click="addUserToArray(a)" class="green">Add</button><br />
  </div>
  <br />
  <button v-on:click="addUser = !addUser">
    {{ addUser ? 'Close' : `Add user to ${city.name}` }}
  </button>
</div>

  data() {
    return {
      cities: [
        {
          name: 'Stockholm',
          users: [
            { name: 'Johan', active: true },
            { name: 'Adam', active: false },
            { name: 'Anders', active: false },
          ],
        },
        {
          name: 'New York',
          users: [
            { name: 'Andy', active: true },
            { name: 'Mitchell', active: false },
            { name: 'Steve', active: false },
          ],
        },
        {
          name: 'San Jose',
          users: [
            { name: 'Riana', active: true },
            { name: 'Rita', active: false },
            { name: 'Montgomery', active: false },
          ],
        },
      ],
      addUser: false,
      newUserName: '',
    };
  },
about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Just replace boolean with index:

const app = Vue.createApp({
  data(){
    return {
      cities: [{name: 'Stockholm', users:[{name: 'Johan', active: true}, {name: 'Adam', active: false}, {name: 'Anders', active: false}]}, {name: 'New York', users:[{name: 'Andy', active: true}, {name: 'Mitchell', active: false}, {name: 'Steve', active: false}]}, {name: 'San Jose', users:[{name: 'Riana', active: true}, {name: 'Rita', active: false}, {name: 'Montgomery', active: false}]}],
      addUser: null,
      newUserName: ''
    }
  },
  computed: {
    activeUser: function(){
      return this.cities.map((city) => {
        return city.users.filter(function(q){
          return q.active
        })
      }).flat()
    }
  },
  methods: {
    // 👇 save user index
    selectUser(idx) {
      this.addUser === idx ? this.addUser = null : this.addUser = idx
    },
    activateUser(a,b){
      this.cities[a].users[b].active = !this.cities[a].users[b].active
    },
    deleteUser(a,b){
      this.cities[a].users.splice(b)
    },
    addUserToArray(a){
      if(this.newUserName == ''){
        return false
      }
      this.cities[a].users.push({name: this.newUserName, active:false})
      this.newUserName = ''
      this.addUser = false
    },
    deActiveAllUsers(){
      this.cities.map((city) => {
        return city.users.forEach(element => element.active = false)
      })
    },
  },
})
app.mount('#demo')
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id="demo">
  <h1>All users</h1>
  <div v-for="(city, index) in cities" :key="index" style="margin-bottom: 30px">
    {{city.name}}
    <div v-for="(user, b) in city.users" :class="[user.active ? 'green' : 'red']">
      {{user.name}} {{b}}
      <button @click="deleteUser(index, b)">Delelete</button>
      <button @click="activateUser(index, b)">{{user.active ? 'Unactive' : 'Active'}}</button>
    </div>
                  <!-- 👇 compare user index -->
    <div v-if="addUser === index" style="margin-top: 10px;">
      <input type="text" v-model="newUserName" placeholder="name"/>&nbsp;
      <button @click="addUserToArray(index)" class="green">Add</button><br>
      {{newUserName}}
    </div>
    <br>
                    <!-- 👇 save user index -->
    <button @click="selectUser(index)">{{addUser === index ? 'Close' : `Add user to ${city.name}`}}</button>
  </div>
  <button @click="deActiveAllUsers">Deactiev all users</button>
  <h1>Active users</h1>
  <div v-if="activeUser.length > 0">
    <div v-for="user in activeUser">{{user.name}}</div>
  </div>
  <div v-else>
  No active users
  </div>
</div>

about 4 years ago · Juan Pablo Isaza Report

0

Observation/Suggestion :

  • As input fields will be dynamic based on the Add user to city button click. Hence, v-model should be unique so that when you trying to add the user in different city it will not retain the previously entered v-model value as all share the same name.

    In template :

    <input type="text" v-model="newUserName[a]" placeholder="name" />
    

    In data object :

    newUserName: []
    
  • You can simply achieve it by just assigning the index to addUser variable (addUser = a) on button click.

Working Demo :

new Vue({
  el: '#app',
  data: {
    cities: [
      {
        name: 'Stockholm',
        users: [
          { name: 'Johan', active: true },
          { name: 'Adam', active: false },
          { name: 'Anders', active: false },
        ],
      },
      {
        name: 'New York',
        users: [
          { name: 'Andy', active: true },
          { name: 'Mitchell', active: false },
          { name: 'Steve', active: false },
        ],
      },
      {
        name: 'San Jose',
        users: [
          { name: 'Riana', active: true },
          { name: 'Rita', active: false },
          { name: 'Montgomery', active: false },
        ],
      },
    ],
    addUser: null,
    newUserName: []
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <div v-for="(city, a) in cities" v-bind:key="city.name" style="margin-bottom: 30px">
    {{ city.name }}
    <div v-for="(user, b) in city.users" :class="[user.active ? 'green' : 'red']">
      {{ user.name }} {{ b }}
      <button v-on:click="deleteUser(a, b)">Delelete</button>
      <button v-on:click="activateUser(a, b)">
        {{ user.active ? 'Unactive' : 'Active' }}
      </button>
    </div>
    <div v-if="addUser === a" style="margin-top: 10px">
      <input type="text" v-model="newUserName[a]" placeholder="name" />&nbsp;
      <button v-on:click="addUserToArray(a)" class="green">Add</button><br />
    </div>
    <br/>
    <button v-on:click="addUser = a">
      {{ addUser === a ? 'Close' : `Add user to ${city.name}` }}
    </button>
  </div>
</div>

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!