Search code examples
vue.jscheckboxvuejs2toggleconditional-rendering

Toggle property by toggling checkbox Vue.js


Sorry in advance if I'm explaining this poorly, I'm a bit of novice at this.

If I have an array that contains multiple objects similar to below, how in Vue do I unselect/select a checkbox in a modal to toggle the value of the visible property based on it's name? I just want to show items that have a visible of true.

Currently, I have a modal popup that displays the name property for each object along with a checkbox. When I uncheck/check the textbox beside one or multiple of the names, I would like the list I have to update, based on the visibility.

I'm picturing the logic to be; if checkbox unchecked, set visibility to false

The code below is basically an outline to what I'm trying to explain, I know it's not syntax perfect, it's more of a visual guide to try and show what I'm asking.

Again, sorry if I'm explaining this poorly.

Thanks so much for any help

<!-- this would be in my modal -->
    <div>
        <input type="checkbox"
               value="usd" />
        <label for="usd">USD</label>
    </div>
        <div>
        <input type="checkbox"
               value="cad"/>
        <label for="cad">CAD</label>
    </div>
<!-- End modal -->

<section v-for="loop through MyArray" v-show="myArray.visible">
  <div>{{name}}</div>
  <div>{{value}}</div>
  <div>{{another}}</div>
  <div>{{high}}</div>
  <div>{{low}}</div>
</section>

    myArray[
            {
             name:"USD",
             value: 0.75,
             another: 0,
             high: 0,
             low: 0,
             visible:true},
            {
             name:"CAD",
             value: 1.75,
             another: 0,
             high: 0,
             low: 0,
             visible:true},
           ]

Solution

  • i tried to simulate a solution to fit to your case, the card in below represents a modal and when check/uncheck the checkbox the value in your table would be changed, you also hide/show the item according to its visibility state like :

       <div class="flex" v-if="item.visible">...</div>
    

    new Vue({
      el: '#app',
    
      data() {
        return {
         myArray:[
                {
                 name:"USD",
                 value: 0.75,
                 another: 0,
                 high: 0,
                 low: 0,
                 visible:true},
                {
                 name:"CAD",
                 value: 1.75,
                 another: 0,
                 high: 0,
                 low: 0,
                 visible:true},
               ],
               selectedItem:{visible:false}
         
         }
      },
     methods:{
           setVisible(){
        
          this.myArray= this.myArray.filter((item)=>{
            if(item.name===this.selectedItem.name){
           item.visible=this.selectedItem.visible;
           return item;
            }else{ return item}
           
           })
           }
      }
      
      });
    .flex{
    display:flex;
    justify-content:space-between;
    align-items:center;
    padding:10px;
    }
    
    .mymodal{
    padding:50px;
    box-shadow:1px 1px 4px #555;
    }
    <link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css"/>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
    
       <div id="app" class="container">
         <section v-for="item in myArray" >
            <div class="flex">
              <div>{{item.name}}</div>
              <div>{{item.value}}</div>
              <div>{{item.another}}</div>
              <div>{{item.high}}</div>
              <div>{{item.low}}</div>
               <div>{{item.visible}}</div>
              <div><button class="btn btn-primary" @click="selectedItem=item"> Show details</button></div>
            </div>
          </section>
        
    
        <div class="mymodal" v-if="selectedItem.visible">
            <input type="checkbox"
                   v-model="selectedItem.visible" @change="setVisible">
            <label for="cad">{{selectedItem.name}}</label>
        </div>
        </div>