选中复选框,并在Vue.js中显示其相关对象

时间:2018-11-07 07:33:50

标签: vue.js

在我的Vue.js项目中,我有两个单独的组件是CountryStates。我将它们合并为一页。因此,现在如果我选择一个国家,它将显示相关的州。该怎么做?

<template>
<div>
    <div style=margin-left:355px><country-index></country-index></div>
    <div style=margin-left:710px><state-index></state-index></div>
</div>
</template>
<script>
import { ROAST_CONFIG } from '../../../config/config.js';
import CountryIndex from    './components/country/Index';
import StateIndex from  './components/state/Index';
import { listen } from  '../../../util/history.js';
import axios from 'axios'
let baseUrl = ROAST_CONFIG.API_URL;

export default {
    name: 'LocationsView',
    layout: 'admin/layouts/default/defaultLayout',
    middleware: 'auth',
    components: {
        'country-index' : CountryIndex,
        'state-index' : StateIndex,
    },
    data() {
        return { currentComponent:'','countryId':''}
    },
    methods: {
        updateCurrentComponent(){
            console.log(this.$route.name);
            let vm = this;
            let route  = vm.$route;

            if(this.$route.name  == "Locations"){
                this.currentComponent = "country-index";
            } 
        }
    },
    mounted() {
        let vm = this;
        let route  = this.$route; 
        window.addEventListener('popstate',this.updateCurrentComponent);
    },
    created() {
        this.updateCurrentComponent();
    }
}   

enter image description here

国家/地区组件

<template>
<div style="display:flex;height:100%">
    <d-dotloader v-if="componentLoading" />
    <div id="parent" class="list-manager" v-if="!componentLoading">
        <div class="list-header">
            <div class="bulk-action"  :class="{'hide': showTop}" >
                <div class="pull-left">
                    Countries
                </div>
                <!-- /pull-left -->
                <div class="pull-right">
                    <d-button  @click.native = "addCountry();"><i class="icon icon-sm"></i><span>New</span></i></d-button>
                </div>
            </div>  
            <!-- /bulk-action -->
            <div class="bulk-action" :style ="{display:(showTop)?'block!important':'none!important'}"  >
                <div class="btn-toolbar">
                    <d-check field-class="check" v-model="selectAll" wrapper-class="field-check field-check-inline" label-position="right" label="" value="sel" @click.native = "toggleSelectAll();"/>

                    <d-button :is-loading="isLoading"  @click.native = "deleteCountry();">Delete<i class="icon icon-sm" name="trash-2"></i></d-button>
                    <!-- <div class="pull-right mt5"><div class="green-bubble"></div>{{SelectedItems}}</div> -->
                    <d-button  @click.native = "closeBulkToolBar();">close<i class="icon icon-sm" name="x"></i></d-button>
                </div>
            </div>
            <!-- /bulk-action -->
        </div>

        <d-dotloader v-if="subListComponentLoading" />
        <d-list-items :data="fetchData"  @rowClick="changeCountryView"  ref="itemsTable">
            <d-list-cell  column-class="list-item-check" :column-styles="{width: '40px'}" type="selectAll">
                <template scope="row">
                    <div class="field-check field-check-inline"  @click.stop="toggleSelect(row.rowIndex)" >
                        <input type="checkbox" class="check" :id="row.id" :value="row.id" :checked="row.selectAll"> 
                        <label></label>
                    </div>
                    <d-button  @click.native = "editCountry(row.id);">Edit</d-button>
                </template>
            </d-list-cell>

            <d-list-cell  column-class="list-item-content">
                <template scope="row">
                    <div class="list-item-content">
                        <div class="list-item-title">
                            <div class="pull-right">{{row.ISO_Code}}</div>
                            <div title="" class="pull-left">{{row.country_name}}</div>
                        </div>
                        <div class="list-item-meta">
                            <div class="pull-right">{{row.Default_Currency}} | {{row.Call_prefix}} </div>
                            <div class="pull-left">{{row.Zone}}</div>
                        </div>
                        <span class="list-item-status enabled"></span>
                    </div>
                </template>
            </d-list-cell >

        </d-list-items>
    </div>
</div>
</template>

<script>
import axios from 'axios'
import { ROAST_CONFIG } from '../../../../../config/config.js';
var baseUrl = ROAST_CONFIG.API_URL;

export default {
    data () {
        return {
            SelectedItems:"",
            isLoading:false,
            show:true,
            searchBy: '',
            activeSearch: '',
            showTop: false,
            selectAll : false,
            componentLoading:true,
            subListComponentLoading:false,
            showModal: false,
            form :{
                country_name: '',
                isCountryEnabled: true,
            }
        }
    },
    methods: { 
        async fetchData ({search, page, filter, sort,rows}) {
            let resData;
            let vm = this;
            axios.defaults.headers.common['Authorization'] = "Bearer "+localStorage.getItem('token'); 
            const res = await axios.post(baseUrl+'/country/fetch',{search, page, filter, sort,rows})
               .then((response) => { 
                    if( (typeof(response) != 'undefined') && (typeof(response.data) != 'undefined') && (typeof(response.data.fetch) != 'undefined')){
                              return response.data.fetch; 
                    }       
                });
            return res;
        },
        toggleSelect(rowId){
            if(typeof(this.$refs.itemsTable.rows[rowId]) != 'undefined'){
                this.$refs.itemsTable.rows[rowId].selectAll = !this.$refs.itemsTable.rows[rowId].selectAll;
                let data  = this.$refs.itemsTable.rows;
                let status  = false;
                let selectAllStatus = true;
                let items  = 0;
                for(var i=0;i <= data.length;i++){
                  if((typeof(data[i])!= 'undefined')&&(data[i].selectAll)){
                       items++;
                       this.SelectedItems  = items +" Selected Items";
                       status = true;
                  }
                  if((typeof(data[i])!= 'undefined')&&(!data[i].selectAll)){
                       selectAllStatus = false;
                  }
                  this.showTop = status
                }
            }
        },
        toggleSelectAll(){
            this.selectAll = !this.selectAll;
            let items  = 0;
            let data  = this.$refs.itemsTable.rows;
            let status = false;
            let rowId = '1'
            for(var i=0;i <= data.length;i++){
              if((typeof(data[i])!= 'undefined')){
                items++;
                this.SelectedItems  = items +" Selected Items";
                status =  this.selectAll;
                data[i].selectAll = status;
              }
            }
            this.showTop = status
        },
        closeBulkToolBar(){
             this.SelectedItems  = "";
             this.showTop = false;
        }, 
    }
 }

状态组件

<template>
<div style="display:flex;height:100%">
    <d-dotloader v-if="componentLoading" />
    <div id="parent" class="list-manager" v-if="!componentLoading">
        <div class="list-header">
            <div class="bulk-action"  :class="{'hide': showTop}" >
                <div class="pull-left">
                    States
                </div>
                <!-- /pull-left -->
                <div class="pull-right">
                    <d-button  @click.native = "addState();"><i class="icon icon-sm"></i><span>New</span></i></d-button>
                </div>
            </div>  
            <!-- /bulk-action -->
            <div class="bulk-action" :style ="{display:(showTop)?'block!important':'none!important'}"  >
                <div class="btn-toolbar">
                    <d-check field-class="check" v-model="selectAll" wrapper-class="field-check field-check-inline" label-position="right" label="" value="sel" @click.native = "toggleSelectAll();"/>

                    <d-button :is-loading="isLoading"  @click.native = "deleteState();">Delete<i class="icon icon-sm" name="trash-2"></i></d-button>
                    <!-- <div class="pull-right mt5"><div class="green-bubble"></div>{{SelectedItems}}</div> -->
                    <d-button  @click.native = "closeBulkToolBar();">close<i class="icon icon-sm" name="x"></i></d-button>
                </div>
            </div>
            <!-- /bulk-action -->
        </div>

        <d-dotloader v-if="subListComponentLoading" />
        <d-list-items :data="fetchData"  @rowClick="changeStateView"  ref="itemsTable">
            <d-list-cell  column-class="list-item-check" :column-styles="{width: '40px'}" type="selectAll">
                <template scope="row">
                    <div class="field-check field-check-inline"  @click.stop="toggleSelect(row.rowIndex)" >
                        <input type="checkbox" class="check" :id="row.id" :value="row.id" :checked="row.selectAll"> 
                        <label></label>
                    </div>
                    <d-button  @click.native = "editState(row.id);">Edit</d-button>
                </template>
            </d-list-cell>



            <d-list-cell  column-class="list-item-content">
                <template scope="row">
                    <div class="list-item-content">
                        <div class="list-item-title">
                            <div class="pull-right">{{row.ISO_Code}}</div>
                            <div title="" class="pull-left">{{row.state_name}}</div>
                        </div>
                        <div class="list-item-meta">
                            <div class="pull-left">{{row.country_name}} </div>
                            <div class="pull-right">{{row.Zone}}</div>
                        </div>
                        <span class="list-item-status enabled"></span>
                    </div>
                </template>
            </d-list-cell >
        </d-list-items>
    </div>
    <state-add></state-add>
    <state-edit></state-edit>
</div>
</template>

<script>
import axios from 'axios'
import { ROAST_CONFIG } from '../../../../../config/config.js';
var baseUrl = ROAST_CONFIG.API_URL;

export default {
    data () {
        return {
            SelectedItems:"",
            isLoading:false,
            show:true,
            searchBy: '',
            activeSearch: '',
            showTop: false,
            selectAll : false,
            componentLoading:true,
            subListComponentLoading:false,
            showModal: false,
            form :{
                country_name: '',
                isCountryEnabled: true,
            }
        }
    },
     methods: {
          async fetchData ({search, page, filter, sort,rows}) {
            let resData;
            let vm = this;
            axios.defaults.headers.common['Authorization'] = "Bearer "+localStorage.getItem('token'); 
            const res = await axios.post(baseUrl+'/state/fetch',{search, page, filter, sort,rows})
               .then((response) => { 
                    if( (typeof(response) != 'undefined') && (typeof(response.data) != 'undefined') && (typeof(response.data.fetch) != 'undefined')){
                              return response.data.fetch; 
                    }       
                });
            return res;
        },
        changeStateView(row){               
            if(typeof(this.$children[7]) != 'undefined'){
                  this.$parent.stateId = row.id;
                  this.viewComponent = "state-main";
                  this.$children[7].readState(this.$parent.stateId);
                  this.$router.push({name:"StatesView", params: {id:row.id}});
            }
        },
        toggleSelect(rowId){
            if(typeof(this.$refs.itemsTable.rows[rowId]) != 'undefined'){
                this.$refs.itemsTable.rows[rowId].selectAll = !this.$refs.itemsTable.rows[rowId].selectAll;
                let data  = this.$refs.itemsTable.rows;
                let status  = false;
                let selectAllStatus = true;
                let items  = 0;
                for(var i=0;i <= data.length;i++){
                  if((typeof(data[i])!= 'undefined')&&(data[i].selectAll)){
                       items++;
                       this.SelectedItems  = items +" Selected Items";
                       status = true;
                  }
                  if((typeof(data[i])!= 'undefined')&&(!data[i].selectAll)){
                       selectAllStatus = false;
                  }
                  this.showTop = status
                }
            }
        },
        toggleSelectAll(){
            this.selectAll = !this.selectAll;
            let items  = 0;
            let data  = this.$refs.itemsTable.rows;
            let status = false;
            let rowId = '1'
            for(var i=0;i <= data.length;i++){
              if((typeof(data[i])!= 'undefined')){
                items++;
                this.SelectedItems  = items +" Selected Items";
                status =  this.selectAll;
                data[i].selectAll = status;
              }
            }
            this.showTop = status
        },
        closeBulkToolBar(){
             this.SelectedItems  = "";
             this.showTop = false;
        },
     }
   }

1 个答案:

答案 0 :(得分:1)

没有您的组件代码,很难准确回答,但我可以尝试一下。要在没有父子关系的两个组件之间进行通信,可以使用 EventBus 。关于如何设置EventBus,您有多种选择。您可以通过Vue根实例using $root传递事件,也可以像this example中那样创建专用的Vue组件。

考虑到您已经在每个国家/地区复选框上绑定了事件countrySelected($event),则可以使用以下方式显示相关状态:

./ components /国家/索引 CountryIndex在选择国家/地区时触发事件

  methods: {
    countrySelected(event) {
      let currentTarget = event.currentTarget
      this.$root.$emit("display-states",currentTarget.countryId);
    }
  }

./ components / state / Index stateIndex组件会监听事件并显示相关状态

    mounted() {
      /**
       * Event listener
       */
      this.$root.$on("display-states", countryId => {
        this.diplayStates(countryId);
      });
    },
    methods: {
      displayStates(countryId) {
      //your method selecting the states to be diplayed 
      }