【问题标题】:How to have Date selector for every button/option clicked in Vuejs如何为 Vuejs 中单击的每个按钮/选项设置日期选择器
【发布时间】:2021-04-09 07:50:59
【问题描述】:

我是 Vuejs 新手,我使用了 3 个按钮,分别是 chart1、chart2 和 chart3。因此,每当我单击任何按钮时,我都希望显示单选类型的日期选择。如下图:

我想要做的是,我试图显示图表,每当单击按钮时,无论单击哪个按钮,我都想显示日期选择。

这是我的尝试:

<template>
  <div class="Different charts">
    <div class="buttons" >
      <vs-button color="warning" size="small" @click="chartapi(chart1, all)">Chart1</vs-button>
      <vs-button color="warning" size="small" @click="chartapi(chart2, all)" >Chart2</vs-button>
      <vs-button color="warning" size="small" @click="chartapi(chart3, all)">Chart3</vs-button>
    </div>
      <ul class="demo-alignment ">
        <li>
          <vs-radio id="all" color="warning" vs-name="options" vs-value="all" v-model="radios2" >All</vs-radio>
        </li>

        <li>
          <vs-radio id="6mon" color="warning"  vs-name="options" vs-value="6mon" v-model="val1">6mon</vs-radio>
        </li>
        <li>
          <vs-radio id="3mon" color="warning"  vs-name="options" vs-value="3mon" v-model="val1">3mon</vs-radio>
        </li>
        <li>
          <vs-radio id="1mon" color="warning"  vs-name="options" vs-value="1mon" v-model="val1">1mon</vs-radio>
        </li>
      </ul>
  <div class="chart-container"> 
  <canvas id="chart"></canvas>
  </div>
  </div>
</template>

<script>
import Chart from 'chart.js'
export default {
  data () {
    return {
      date: [],
      challenge: [],
      data: [],
      val1: 'all'
    }
  },
  mounted () {
    this.chartapi()
  },
  methods: {
    chartapi (type_name, interval) {
      this.$http.get(`/different/chart/${ type_name  }?interval=${  interval}`)
        .then((r) => {
          this.date = r.data.date
          this.challenge = r.data.challenge
          this.data = this.date.map((date, index) => ({
            x: new Date(date * 1000),
            y: this.challenge[index]
          }))

          const ctx = this.$refs.chart.getContext('2d')
          new Chart(ctx, {
            type: 'line',
            data: {
              datasets: [
                {
                  label: 'Challenge',
                  data: this.data,
                  borderColor: 'black',
                }
              ]
            },
            options: {
              scales: {
                yAxes: [
                  {
                    ticks: {
                      callback (value) {
                        return `${value}%`
                      }
                    }
                  }
                ],
                xAxes: [
                  {
                    type: 'time',
                    time: {
                      unit: 'month'
                    }
                  }
                ]
              }
            }
          })
        })
    }
  }
}
</script>

正如您所看到的我的代码,您可以理解,每当单击按钮时,都会显示相应的图表

并且我在用于指定日期范围选择值的方法中使用了间隔。

我的问题是如何显示所有选项(按钮)的日期范围选择以及如何在单选按钮中指定间隔。

例如,如果 chartapi(chart1, 3mon) 则显示前 3 个月的 chart1 数据。但我想要的是当单击按钮时它应该显示整个图表数据,如果用户想要查看任何间隔,他可以使用单选按钮,即日期范围选择。所以我想知道如何将间隔集成到单选按钮。请帮帮我。

【问题讨论】:

    标签: javascript vue.js button radio


    【解决方案1】:

    据我了解,您需要在单击按钮时获取所有数据,然后相应地选择单选按钮,并且您希望在更改单选按钮时更改数据。因此您可以按以下方式更改代码,

    <template>
      <div class="Different charts">
        <div class="buttons" >
          <vs-button color="warning" size="small" @click="handleBtnClick(chart1)">Chart1</vs-button>
          <vs-button color="warning" size="small" @click="handleBtnClick(chart2)" >Chart2</vs-button>
          <vs-button color="warning" size="small" @click="handleBtnClick(chart3)">Chart3</vs-button>
        </div>
          <ul class="demo-alignment ">
            <li>
              <vs-radio id="all" color="warning" vs-name="options" vs-value="all" v-model="val1" >All</vs-radio>
            </li>
    
            <li>
              <vs-radio id="6mon" color="warning"  vs-name="options" vs-value="6mon" v-model="val1">6mon</vs-radio>
            </li>
            <li>
              <vs-radio id="3mon" color="warning"  vs-name="options" vs-value="3mon" v-model="val1">3mon</vs-radio>
            </li>
            <li>
              <vs-radio id="1mon" color="warning"  vs-name="options" vs-value="1mon" v-model="val1">1mon</vs-radio>
            </li>
          </ul>
      <div class="chart-container"> 
      <canvas id="chart"></canvas>
      </div>
      </div>
    </template>
    
    <script>
    import Chart from 'chart.js'
    export default {
      data () {
        return {
          date: [],
          challenge: [],
          data: [],
          val1: 'all',
          type: 'chart1'
        }
      },
      mounted () {
        this.chartapi(type, val1);
      },
      methods: {
          handleBtnClick: (chart) => {
              /* This is a method to use in button click */
              this.type = chart;
              this.val1 = 'all' // Assigning 'all' as initial value for each chart
              this.chartapi(this.type, this.val1);
          },
        chartapi (type_name, interval) {
          this.$http.get(`/different/chart/${ type_name  }?interval=${  interval}`)
            .then((r) => {
              this.date = r.data.date
              this.challenge = r.data.challenge
              this.data = this.date.map((date, index) => ({
                x: new Date(date * 1000),
                y: this.challenge[index]
              }))
    
              const ctx = this.$refs.chart.getContext('2d')
              new Chart(ctx, {
                type: 'line',
                data: {
                  datasets: [
                    {
                      label: 'Challenge',
                      data: this.data,
                      borderColor: 'black',
                    }
                  ]
                },
                options: {
                  scales: {
                    yAxes: [
                      {
                        ticks: {
                          callback (value) {
                            return `${value}%`
                          }
                        }
                      }
                    ],
                    xAxes: [
                      {
                        type: 'time',
                        time: {
                          unit: 'month'
                        }
                      }
                    ]
                  }
                }
              })
            })
        }
      },
      watch: {
          /* You can write a watcher for listen the changes of the radio button */
          val1:(prevValue, newValue) => {
              /* This method triggers everytime you change the value of val1 */
              this.chartapi(this.type, newValue);
          }
      }
    }
    </script>
    

    我所做的改变是,

    1. 添加单独的数据字段/变量以分配图表类型
    2. 创建一个单独的方法来触发相应地更改type 变量的按钮并将val1 更改回全部。
    3. 创建观察者来观察val1 和如果val1 变化分别加载图表。

    更新

    由于你不清楚 watcher 是如何工作的,我们可以在 vue 中创建 watcher 作为一种特殊的函数,它会在相关数据字段更新时触发。

    首先,我们将单选按钮绑定到val1 数据字段,如下所示。

    <ul class="demo-alignment ">
            <li>
              <vs-radio id="all" color="warning" vs-name="options" vs-value="all" v-model="val1" >All</vs-radio>
            </li>
    
            <li>
              <vs-radio id="6mon" color="warning"  vs-name="options" vs-value="6mon" v-model="val1">6mon</vs-radio>
            </li>
            <li>
              <vs-radio id="3mon" color="warning"  vs-name="options" vs-value="3mon" v-model="val1">3mon</vs-radio>
            </li>
            <li>
              <vs-radio id="1mon" color="warning"  vs-name="options" vs-value="1mon" v-model="val1">1mon</vs-radio>
            </li>
          </ul>
    

    您可以看到所有单选按钮都是v-bindval1,因此 val1 的值会根据所选单选按钮而变化。 (全部,6mon,3mon,1mon)。

    接下来,我们为val1创建天气,代码如下。

    watch: {
          /* You can write a watcher for listen the changes of the radio button */
          val1: (prevValue, newValue) => {
              /* This method triggers everytime you change the value of val1 */
              this.chartapi(this.type, newValue);
          }
      }
    

    我们创建与数据字段同名的观察程序,并且每次val1 更改时都会触发它(这意味着它会在您更改单选按钮时触发)。然后在观察者内部,当值发生变化时,我们调用chartapi,并将val1 的新值作为第二个参数。这使得图表根据所选月份再次加载。

    【讨论】:

    • 非常感谢按钮部分,但我真正想要的是,我有 3 个按钮,所以每当我点击任何按钮时,最初应该显示整个图表,即具有“所有”间隔,那么如果用户希望更改图表的间隔,他可以通过更改单选按钮来做到这一点,所以现在我想知道如何将图表间隔(例如 '6mon' '3mon' & '1mon' )集成到单选按钮和最重要的是,必须为单击的任何图表按钮显示单选按钮。请帮我解决这个问题。
    • @app_er 我想你有答案,据我所知,如果你将 all 作为它检索整个图表的图表 API 方法的第二个参数传递。所以在方法handleBtnClick 每次val1 更改为all 所以并将其传递给第二个参数。因此,每次单击按钮时,您都会获取所有数据并将单选按钮重置为全部。对于您的第二个需求,val1 上的观察器会在您每次更改单选按钮时触发。所以我认为这种情况也得到了解决。您还必须更改所有收音机才能连接与我更改的代码相同的 v-model。
    • 你好@Vikum Dheemantha,我刚刚尝试了你的答案,它工作得非常好,但是当我选择了chart1时,我可以看到chart1的“all”间隔和“all”选中了单选按钮,到目前为止一切都很好,但是如果用户希望更改单选按钮,chart1 必须更改,这意味着最初它将以“全部”间隔显示,因此只会检查“全部”单选按钮,如果用户更改单选按钮,如选中“6m”,则chart1的间隔必须从“all”变为“6m”间隔。希望你理解,请帮助我。
    • 目的:假设chart1被点击,它应该显示'all'区间的图表,所以“all”被选中。如果单选按钮更改为“6m”,则图表 1 的日期范围必须更改,并且必须分别以“6m”间隔显示图表 1,依此类推。但最初它应该在单击任何图表时显示“全部”间隔。所以,我想在每个单选按钮中使用@click,这应该改变相应的间隔,与点击的相应图表的名称相同。请帮我解决这个问题。
    • @app_er 是的,我明白了。您可以将@click 添加到单选按钮并实现相同的目标,但该方法会很复杂。但是这种情况 vue.js watchers 就派上用场了。有了它,您可以观察数据字段并使其在数据字段更改时执行某些操作。如果您使用单选按钮正确绑定日期,那么我创建的 watcher 方法应该相应地调用图表数据。查看 vuejs.org/v2/guide/computed.html#Watchers 了解有关 vue 观察者的更多详细信息。
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多