【问题标题】:Navigating through Vue.Js survey浏览 Vue.Js 调查
【发布时间】:2017-05-08 21:46:18
【问题描述】:

我正在使用 Vue.Js 进行调查,这基本上是应用程序的主要部分和目的。我的导航有问题。我的上一个按钮不起作用,下一个继续循环,而不是只前进到下一个问题。我想要完成的只是一次只显示一个问题,并使用 next 和 prev 按钮以正确的顺序浏览它们,并存储每个输入的值,我稍后将使用这些值来计算输出调查结束后,在结果页面上。我已经上传了一个简短的代码示例,其中只有两个问题只是为了展示这个问题。 https://jsfiddle.net/cgrwe0u8/

    new Vue({
  el: '#quizz',
  data: {
    question1: 'How old are you?',
    question2: 'How many times do you workout per week?',
    show: true,
    answer13: null,
    answer10: null

  }

})

document.querySelector('#answer13').getAttribute('value');
document.querySelector('#answer10').getAttribute('value');

HTML

    <script src="https://unpkg.com/vue"></script>

<div id="quizz" class="question">
    <h2 v-if=show>{{ question1 }}</h2>
    <input v-if=show type="number" v-model="answer13">
    <h2 v-if="!show">{{ question2 }}</h2>
    <input v-if="!show" type="number" v-model="answer10">
    <br>
<div class='button' id='next'><a href='#' @click="show = !show">Next</a></div>
<div class='button' id='prev'><a href='#' @click="show = show">Prev</a>
</div>
</div>

提前致谢!

【问题讨论】:

    标签: javascript html vue.js


    【解决方案1】:

    您应该考虑制作一个用于调查问题的 Vue 组件,这样您就可以轻松地创建多个不同的问题。

    Vue.component('survey-question', {
      template: `<div><h2>{{question.text}}</h2><input type="number" v-model="question.answer" /></div>`,
      props: ['question']
    });
    

    我已更新您的代码并实现了next 功能,以便您可以尝试创建prev 功能。当然,你应该多清理一下。也许在问题对象上添加一个属性,以便它可以设置input 应该是什么类型。像这样的东西,使它更可重用。

    https://jsfiddle.net/9rsuwxvL/2/

    【讨论】:

    • 是的,我必须修改组件中的模板,因为不同的问题需要不同的输入,例如输入文本、单选按钮、选择表单等。所以我认为我无法使用 v-model="question.answer" 来获得答案。也许使用 querySelectorAll() 来获得所有答案?我对 JS 和 Vue.Js 不是很有经验,所以我不确定解决问题的最佳方法是什么。
    • 你想对答案做什么?显示它们还是将它们发送到服务器?
    • 我想根据使用方程式的答案显示输出。现在我正在尝试在问题中添加输入类型,以便我可以操作输入法。我可以这样做吗,它现在不起作用。这是尝试的小提琴,给你一个想法。 jsfiddle.net/cgrwe0u8/4
    • 我添加了 v-bind 并且它起作用了。它只显示一个单选按钮,所以我必须弄清楚如何添加更多。 jsfiddle.net/cgrwe0u8/5
    • 我已经更新了我的答案以显示您将如何显示结果。使用 Vue 就是使用组件来创建可管理的应用程序。 jsfiddle.net/9rsuwxvL/4
    【解决方案2】:

    如果您拥有超过 1 个的东西,请尝试使用数组,并使用循环对其进行处理。在这种情况下,您不需要循环,但需要记住这一点。

    由于您一次只需要呈现一个问题,因此只需使用计算属性根据某个索引查找当前问题。该索引将通过下一个/上一个按钮增加/减少。

    使用这种格式的代码,如果需要添加问题,只需将其添加到数组中即可。

    https://jsfiddle.net/cgrwe0u8/1/

    new Vue({
      el: '#quizz',
      data: {
        questions:[
            {question:'How old are you?', answer: ''},
          {question:'How many times do you workout per week?', answer: ''},
        ],
        index:0
      },
      computed:{
        currentQuestion(){
            return this.questions[this.index]
        }
      },
      methods:{
        next(){
            if(this.index + 1 == this.questions.length)
            this.index = 0;
          else
            this.index++;
    
        },
        previous(){
            if(this.index - 1 < 0)
            this.index = this.questions.length - 1;
          else
            this.index--;
        }
      }
    
    })
    

    【讨论】:

    • 是的,我需要一个更智能的解决方案,因为我有两个以上的问题。但是,如果我有不同的输入表单,我该怎么做,例如单选按钮和文本作为答案的输入。此外,现在 next 和 prev 都在循环。例如,我想从第一个问题开始,当我到达最后一个问题时,无法继续前进。也许使用一些 js 函数来隐藏/显示 prev 和 next 取决于问题的索引。
    • 例如第一个问题是“你的性别是什么?”最后是“你每周锻炼多少次?” jsfiddle.net/cgrwe0u8/2
    • 我在上一个方法中添加了这两行,以隐藏第一个问题的 prev,但现在它的行为与预期不同。它不会从第一个问题返回,这很好,但是当您点击 prev 时,从第二个或第三个问题它会返回到第一个问题。这是小提琴jsfiddle.net/cgrwe0u8/3
    • 很抱歉,您需要学习更多的javascript。 Vue 只会让你更加困惑。
    • 说实话,我发现 Vue 比普通的 javascript 简单得多,你可以用更少的代码行做大部分事情。
    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多