【问题标题】:Vue Material - Styling the table buttons?Vue Material - 为表格按钮设计样式?
【发布时间】:2017-04-11 00:07:36
【问题描述】:

我在玩VueVue Material 组件,特别是Table component

我想做的是更改标题为Within cards with Pagination and Inline Edit 的表格示例中的搜索图标/按钮的颜色,但似乎我必须遗漏一些东西,因为我无法让它从默认的灰色的颜色,我正在努力理解为什么会这样。

我有一个基本页面,其中包含 Vue 以及 Vue 材料所需的字体和图标以及它工作所需的 Javascript 和 CSS 文件。

index.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Testing</title>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic">
  <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
  <link rel="stylesheet" href="https://cdn.rawgit.com/marcosmoura/vue-material/master/dist/vue-material.css" />
</head>
<body>
  <div id="app" v-md-theme="'default'">
    <md-table-card>
      <md-toolbar>
        <h1 class="md-title">Nutrition</h1>
        <md-button class="md-icon-button">
          <md-icon>filter_list</md-icon>
        </md-button>

        <md-button class="md-icon-button" @click="toggleSearch()">
          <md-icon v-if="searchEnabled" class="md-accent">search</md-icon>
          <md-icon v-else>search</md-icon>
        </md-button>
      </md-toolbar>

      <md-table md-sort="dessert" md-sort-type="desc" @select="onSelect" @sort="onSort">
        <md-table-header>
          <md-table-row>
            <md-table-head md-sort-by="dessert">Dessert (100g serving)</md-table-head>
            <md-table-head md-sort-by="calories" md-numeric md-tooltip="The total amount of food energy and the given serving size">Calories (g)</md-table-head>
            <md-table-head md-sort-by="fat" md-numeric>Fat (g)</md-table-head>
            <md-table-head md-sort-by="carbs" md-numeric>Carbs (g)</md-table-head>
            <md-table-head md-sort-by="protein" md-numeric>Protein (g)</md-table-head>
            <md-table-head>
              <md-icon>message</md-icon>
              <span>Comments</span>
            </md-table-head>
          </md-table-row>
        </md-table-header>

        <md-table-body>
          <md-table-row v-for="(row, rowIndex) in nutrition" :key="rowIndex" :md-item="row" md-auto-select md-selection>
            <md-table-cell v-for="(column, columnIndex) in row" :key="columnIndex" :md-numeric="columnIndex !== 'dessert' && columnIndex !== 'comment'" v-if="columnIndex !== 'type'">
              <md-table-edit
                :md-name="'comment' + columnIndex"
                :md-id="'comment' + columnIndex"
                md-placeholder="Add a comment"
                md-maxlength="120"
                v-model="nutrition[rowIndex].comment"
                v-if="columnIndex === 'comment'"></md-table-edit>

              <span v-if="columnIndex !== 'comment'"></span>
            </md-table-cell>
          </md-table-row>
        </md-table-body>
      </md-table>

      <md-table-pagination
        md-size="10"
        md-total="5"
        md-page="1"
        md-label="Rows"
        md-separator="of"
        :md-page-options="[5, 10, 25, 50]"
        @pagination="onPagination"></md-table-pagination>
    </md-table-card>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.3/vue.js" type="text/javascript"></script>
  <script src="https://cdn.rawgit.com/marcosmoura/vue-material/master/dist/vue-material.js" type="text/javascript"></script>
  <script src="app.js" type="text/javascript"></script>
</body>
</html>

app.js

// Enable Vue Material
Vue.use(VueMaterial);

// Apply theme
Vue.material.theme.register('default', {
  primary: 'blue',
  accent: 'light-blue'
});

// Initialise Vue
new Vue({
  el: '#app',
  data: {
    nutrition: [{
      dessert: 'Frozen yogurt',
      type: 'ice_cream',
      calories: '159',
      fat: '6.0',
      carbs: '24',
      protein: '4.0',
      comment: 'Icy'
    }],
    selectedData: [],
    sort: {},
    page: {},
    searchEnabled: false
  },
  methods: {
    onSelect: function (data) {
      this.selectedData = data;
      this.$forceUpdate();
    },
    onSort: function (sort) {
      this.sort = sort;
    },
    onPagination: function (page) {
      this.page = page;
    },
    toggleSearch: function () {
      console.log(this.searchEnabled);
      if (this.searchEnabled) {
        this.searchEnabled = false;
      } else {
        this.searchEnabled = true;
      }
    }
  }
});

当我加载页面时,我会像示例一样获得带有表格的应用程序。当我点击搜索图标时,我可以看到来自方法toggleSearch() 的控制台日志,并且它在布尔值之间按预期变化,但是,搜索图标的颜色没有改变。

查看搜索按钮的 HTML 组件:

<md-button class="md-icon-button" @click="toggleSearch()">
  <md-icon v-if="searchEnabled" class="md-accent">search</md-icon>
  <md-icon v-else>search</md-icon>
</md-button>

我使用 if / else 条件在重音类和我假设的默认灰色之间切换,具体取决于布尔值 searchEnabled,这适用于独立按钮,但不适用于表格内部。

任何人都可以就为什么会发生这种情况或我应该如何在表格中设置此按钮的样式提出一个原因。任何意见或反馈将不胜感激,非常感谢!

(如果您可以建议 Vue 中是否有一种方法可以有条件地应用一个类,即不是使用v-ifv-else 和复制图标元素,那么我是否有另一种方法可以应用该类基于布尔值并且只使用一个图标元素?)

【问题讨论】:

    标签: vue.js vue-material


    【解决方案1】:

    是的,您可以使用 VueJs 进行动态样式设置,Here 是相同的文档。您可以将对象传递给v-bind:class 以动态切换类:

    <md-button class="md-icon-button" @click="toggleSearch()">
      <md-icon v-bind:class="{ 'md-accent': searchEnabled }">search</md-icon>
    </md-button>
    

    上述语法意味着md-accent类的存在将由数据属性searchEnabled的真实性决定。

    【讨论】:

    • 获得的奖励积分 :-) 谢谢,效果很好,但仍然无法在 Vue Material 表中搜索按钮。任何想法为什么或对您来说似乎是一个错误?
    • 本来打算做一个小编辑但不能,您需要将 "md-accent" 的引号更改为单引号 'md-accent'
    • @CraigvanTonder 完成,感谢您的指出。这也是我回答的搜索按钮不起作用或不同?
    • 在此处查看第二个示例中右上角的放大镜:marcosmoura.github.io/vue-material/#/components/table ~ 您提供的代码适用于其他按钮,但在 Vue Material 表中设置此按钮的样式时无效,即我的问题直接。现在想知道这是否是一个错误,因为它似乎应该可以工作,但我只得到一个灰色图标,如文档示例中所示。
    • 可能是您尝试更改的 CSS 属性被覆盖,您可能需要为该 CSS 属性编写一个带有 !important 的新类。
    【解决方案2】:

    这是在 v0.4.0 中修复的错误

    【讨论】:

    • 给@saurabh 答案,因为他的解决方案涵盖了如果没有影响事物的错误,如何设置按钮样式。
    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2011-07-24
    • 2021-06-06
    • 2023-03-21
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多