【vue】vue入门-使用vue实现简单的一问一答小案例

本文介绍如何使用Vue.js监听用户输入并在输入变化时向指定API发送请求获取yes/no回答及对应动态图的过程。

首先引入vue的包:

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

本次案例除了引入vue的包外,还需要引入第三方的包:

<!-- 因为 AJAX 库和通用工具的生态已经相当丰富,Vue 核心代码没有重复 -->
<!-- 提供这些功能以保持精简。这也可以让你自由选择自己更熟悉的工具。 -->
<script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>

首先我们找到一个接口: 

https://yesno.wtf/api


该接口是提供一个json接口,返回问题的答案yes或者no以及相应的动态图

html结构如下:

<body>
    <div id="watch-example">
        <p>
            提出一个答案只能是Yes/No的问题:
            <input type="text" v-model="question" />
        </p>
        <p>
            {{ answer }}<br>
            <img src="https://yesno.wtf/assets/yes/7-653c8ee5d3a6bbafd759142c9c18d76c.gif" width="300px" height="200px">
        </p>
        <!--no: https://yesno.wtf/assets/no/21-05540164de4e3229609f106e468fa8e7.gif-->
        <!--yes: https://yesno.wtf/assets/yes/7-653c8ee5d3a6bbafd759142c9c18d76c.gif-->
    </div>
</body>

然后我们创建一个Vue实例,使用watch对输入框进行监听。如果发生变化,则向https://yesno.wtf/api发起请求,并处理响应过来的json字符串。

<script>
    var watchExampleVm = new Vue({
        el:'#watch-example',
        data:{
            question:'',
            answer:'没有问题我怎么回答?'
        },
        watch:{
            //如果question发生改变,这个函数就会运行
            question:function(){
                this.answer = '等待关闭';
                //调用方法
                this.getAnswer()
            }
        },
        methods:{
            // `_.debounce` 是一个通过 Lodash 限制操作频率的函数。
            // 在这个例子中,我们希望限制访问 yesno.wtf/api 的频率
            // AJAX 请求直到用户输入完毕才会发出。想要了解更多关于
            // `_.debounce` 函数 (及其近亲 `_.throttle`) 的知识,
            // 请参考:https://lodash.com/docs#debounce
            getAnswer: _.debounce(function(){
                if (this.question.indexOf('?') === -1) {
                    this.answer = '问题通常有一个标记. ;-)';
                    return
                }
                this.answer = '思考中';
                var vm = this;
                axios.get('https://yesno.wtf/api').then(function(response){
                    vm.answer = _.capitalize(response.data.answer);
                    var img = document.getElementsByTagName("img")[0];
                    //用于替换所用的图片
                    img.src = response.data.image;
                }).catch(function(error){
                    vm.answer = '错误,不能捕捉到API.' + error
                }),
                // 判定用户停止输入等待的毫秒数
                500
            })
        }
    })
</script>

运行结果如下:

当输入带?(英文的)的提问?就会发出请求



### 使用 Vue2 实现一问一答时事对话框组件 在 Vue2 中实现一个类似豆包的一问一答时事对话框组件,可以通过以下方式完成。以下是详细的实现方法: #### 1. 组件结构设计 对话框组件可以分为两个主要部分:问题显示区和回答输入区。用户可以在回答输入区提交答案后,触发状态更新以显示下一个问题或结果。 ```vue <template> <div class="dialog-box"> <h3>{{ currentQuestion }}</h3> <input type="text" v-model="userAnswer" @keyup.enter="submitAnswer" placeholder="请输入您的答案" /> <button @click="submitAnswer">提交</button> </div> </template> <script> export default { data() { return { questions: [ "问题1:Vue2 的核心特性是什么?", "问题2:组合式 API 和选项式 API 的区别是什么?", "问题3Vue Router 的作用是什么?" ], answers: [], currentIndex: 0, userAnswer: "" }; }, computed: { currentQuestion() { return this.questions[this.currentIndex]; } }, methods: { submitAnswer() { if (this.userAnswer.trim() === "") { alert("请输入有效答案!"); return; } this.answers.push(this.userAnswer); this.userAnswer = ""; if (this.currentIndex < this.questions.length - 1) { this.currentIndex++; } else { alert("所有问题已回答完毕!"); console.log("用户答案:", this.answers); } } } }; </script> <style scoped> .dialog-box { width: 400px; margin: 50px auto; padding: 20px; border: 1px solid #ccc; border-radius: 8px; } input { width: 100%; padding: 8px; margin-bottom: 10px; border: 1px solid #ccc; border-radius: 4px; } button { padding: 8px 16px; background-color: #42b983; color: white; border: none; border-radius: 4px; cursor: pointer; } button:hover { background-color: #38a169; } </style> ``` #### 2. 功能说明 - **数据模型**:`questions` 数组存储所有问题,`answers` 数组用于保存用户的回答,`currentIndex` 控制当前问题索引。 - **交互逻辑**:通过 `v-model` 绑定用户输入的答案,点击“提交”按钮或按下回车键时调用 `submitAnswer` 方法[^1]。 - **状态更新**:当用户提交答案后,检查是否还有未回答的问题;如果有,则切换到下一个问题;如果没有,则提示用户已完成所有问题并输出答案[^2]。 #### 3. 样式优化 组件样式通过 `<style scoped>` 定义,确保样式仅作用于当前组件[^3]。可以根据需求进一步调整样式以适配具体场景。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值