如何动态添加 vue bootstrap 下拉列表项?

Posted

技术标签:

【中文标题】如何动态添加 vue bootstrap 下拉列表项?【英文标题】:How to dynamically add vue bootstrap dropwdown list item? 【发布时间】:2020-02-15 18:16:24 【问题描述】:

我正在尝试使用 bootstrap-vue 动态添加下拉列表项,但无法将下拉列表项呈现给浏览器。这是我到目前为止所拥有的,任何输入将不胜感激。我希望它是动态的,因此如果原始 JSON 发生更改,下拉列表项将随之更改,而无需返回并更改代码。

注意:reportData 是一个对象列表,这就是为什么我将 reportData 的第一个元素设置为我希望从中呈现下拉列表项的 newData。

下拉列表组件:

  <section class="drop-down">
    <div>
      <b-dropdown id="dropdown-list" text="Error Reports" class="m-md-2">
       <b-dropdown-item >ITEM</b-dropdown-item>
        <b-dropdown-divider></b-dropdown-divider>
      </b-dropdown>
    </div>

    <button @click="changeReport">Click to change</button>
  </section>
</template>

<script lang="js">

  export default  
    name: 'drop-down',
    props:['reportData'],
    data () 
      return 
        newData: this.reportData[0]
      
    ,
    methods: 
      changeReport()
        this.newData = this.reporData[1]
      
    ,
    watch: 
      newData : function(val, OldVal)
        var dropdownList = document.getElementById("dropdown-list")
          for (var key in val)
            console.log(key)
            var dropdownItem = document.createElement('b-dropdown-item')
            dropdownItem.value = key
            dropdownList.add(drowdownItem, 0)
          
      
    



</script>

<style>

</style>

【问题讨论】:

【参考方案1】:

在使用 Vue 时尽量避免直接操作 DOM。在这种情况下,您最好的选择是将当前活动数据设置为您想要显示的任何列表。然后,在模板中,循环遍历每个活动数据项。

new Vue(
  el: "#app",
  data: 
    reportData: [
      text: 'Item 1 Text',
      value: 'Item 1 Value'
    , 
      text: 'Item 2 Text',
      value: 'Item 2 Value'
    , 
      text: 'Item 3 Text',
      value: 'Item 3 Value'
    ],
  
)
<link type="text/css" rel="stylesheet" href="https://unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<link type="text/css" rel="stylesheet" href="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css" />

<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>

<div id="app">
  <section class="drop-down">
    <b-dropdown text="Error Reports" class="m-md-2">
      <b-dropdown-item v-for="(item, key) in reportData" :key="key">
         item.text :  item.value 
      </b-dropdown-item>
    </b-dropdown>
  </section>
</div>

如果您有任何问题,请随时告诉我。


编辑:

如果您有嵌套的对象数组并且您提前知道其结构,以下示例可能有助于阐明您需要做什么。

但是,如果您不知道树的深度,您可能不得不考虑使用recursive components。

new Vue(
  el: "#app",
  data: 
    // This is your input data
    dataStore: [
      name: 'Item 1',
      value: [
        text: 'SubItem 1 Text',
        value: 'SubItem 1 Value'
      , 
        text: 'SubItem 2 Text',
        value: 'SubItem 2 Value'
      , 
        text: 'SubItem 3 Text',
        value: 'SubItem 3 Value'
      ]
    , 
      name: 'Item 2',
      value: [
        text: 'SubItem 1 Text',
        value: 'SubItem 1 Value'
      , 
        text: 'SubItem 2 Text',
        value: 'SubItem 2 Value'
      , 
        text: 'SubItem 3 Text',
        value: 'SubItem 3 Value'
      , 
        text: 'SubItem 4 Text',
        value: 'SubItem 4 Value'
      , 
        text: 'SubItem 5 Text',
        value: 'SubItem 5 Value'
      , ]
    ],

    // This is the data we will display
    activeData: null
  ,

  created() 
    // The value that will be selected upon creation
    this.activeData = this.dataStore[0]
  ,

  methods: 
    changeData() 
      this.activeData = this.dataStore[1]
    
  
)
<link type="text/css" rel="stylesheet" href="https://unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<link type="text/css" rel="stylesheet" href="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css" />

<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>

<div id="app">
  <section v-if="activeData" class="drop-down">
    <h2> activeData.name </h2>
    <b-dropdown text="Error Reports" class="m-md-2">
      <b-dropdown-item v-for="(item, key) in activeData.value" :key="key">
         item.text :  item.value 
      </b-dropdown-item>
    </b-dropdown>
  </section>

  <button @click="changeData">Change Data Item</button>
</div>

【讨论】:

是的,我认为最好也这样做。如果我的数据中有一个值的对象数组,你有什么建议?示例:new Vue( el: "#app", data: reportData: [ text: 'Item 1 Text', value: 'Item 1 Value' , text: 'Item 2 Text', value: 'Item 2 Value' , text: 'Item 3 Text', value: [ text: 'Item 1 Text', value: 'Item 1 Value' , text: 'Item 2 Text', value: 'Item 2 Value' , ], ) 我添加了一个编辑,解释了如何处理嵌套的对象数组。但是,如果您不提前知道树的结构或深度,您很可能不得不使用递归组件。【参考方案2】:

试试这个

      <b-dropdown id="dropdown-list" text="Error Reports" class="m-md-2">
       <b-dropdown-item v-for="item in listItems">@ item </b-dropdown-item>
        <b-dropdown-divider></b-dropdown-divider>
      </b-dropdown>

      <button @changeReport>Click To Change</button>

在你的 JS....

    data() 
      items: []
    ,

    computed: 
      listItems() 
        return this.items;
      
    ,
    methods: 
      changeReport()
        this.items = this.reporData[1]
      

类似的东西。我不确切知道您的数据是什么样的,但如果您用新数据填充 this.list,计算属性会注意到更改并重新呈现您的下拉列表。

【讨论】:

以上是关于如何动态添加 vue bootstrap 下拉列表项?的主要内容,如果未能解决你的问题,请参考以下文章

bootstrap selectpicker不使用angularjs动态数据加载下拉列表

Vue.js - 选择/下拉选定项 vm 绑定不起作用(bootstrap-vue)

Datatables Jquery Bootstrap 5在行中创建动态下拉列表并将数据发布到php文件

Bootstrap 3:如何在导航栏中使下拉链接的头部可点击

使用 bootstrap v3 为 asp.net 下拉列表控件添加样式

用于bootstrap选择的动态工具提示