找个了题目<<问卷调查>>
1.定义组件checkbox,radio,textarea
input-radios.js radio的组件,传入数组
Vue.component ("input-radios", { template : "<div>" + "<span v-for='(opt,index) in allOpts'>" + "<input type='radio' name='opt' :checked='initOpt==opt.id' :value='opt.id' @click='updateVal'><label>{{opt.id}}-{{opt.name}}</label>" + "</span></div>", props : { allOpts : { type : Array, default : [] }, initOpt:{ type : Number, default : 1 } }, data: function () { return { initOpt : this.initOpt } }, methods : { updateVal:function(e){ this.$emit('change',e.target.value); } }, watch:{ init:{ handler:function(newValue, oldValue) { console.log(newValue) }, deep: true } }, mounted : function () { if(this.id){ this.$emit('btnwatch'); } } });
2.checkbox组件
Vue.component ("input-checkboxs", { template : "<div>" + "<p v-for='(opt,index) in allOpts'>" + "<input type='checkbox' :checked='initOpts.indexOf(opt.id)>-1' :value='opt.id' @click='updateVal'><label>{{opt.id}}-{{opt.name}}</label></p>" + "</div>", props : { allOpts : { type : Array, default : [] }, initOpts:{ type:Array, default:[] } }, data:function(){ return { initOpts:this.initOpts } }, computed:{ }, methods : { updateVal:function(e){ if(e.target.checked){ this.$emit('change',parseInt(e.target.value),true); }else{ this.$emit('change',parseInt(e.target.value),false); } this.$emit('btnwatch'); } }, mounted : function () { this.$emit('btnwatch'); } });
3.textarea组件
Vue.component ("input-textarea", { template : "<div><div>" + "<textarea :value='content' @input='updateVal' @input='updateNotice' style='height: 100px;width:70%'></textarea>" + "</div><span>{{notice}}</span></div>", props:{ content:{ type:String, default : {} }, maxNum:{ type : Number, default : 100 }, minNum:{ type : Number, default : 20 } }, data:function(){ return { content:this.content, notice:"至少还差"+this.minNum+"字" } }, methods:{ updateVal:function(e){ var txt = e.target.value; if(txt.length>this.maxNum){ txt = e.target.value = txt.substring(0, this.maxNum); } this.$emit("change",txt); this.$emit("btnwatch",txt); }, updateNotice:function(e){ var len = e.target.value.length; if(len<this.minNum){ this.notice="至少还差"+(this.minNum-len)+"字"; }else if(len<this.maxNum){ this.notice="最多还可填写"+(this.maxNum-len)+"字"; }else{ this.notice="达到最大字数限制"; } } }, watchs:{ content:function(val){ } } });
4.index.js使用组件构建问卷调查
var app = new Vue({ el : "#app", data:{ sexs:[{id:1,name:"男"},{id:2,name:"女"},{id:3,name:"保密"}], interests:[{id:1,name:"看书"},{id:2,name:"游泳"},{id:3,name:"爬山"},{id:4,name:"看电影"},{id:5,name:"听音乐"},{id:6,name:"跑步"}], i:1, btnstate:{ prevDisabled:true, nextDisabled:true, submitDisabled:true, }, formdata:{ sex:2, interest:[1], introduce : '' } }, methods:{ prevent:function(event){ if(this.i<=3) return; }, submit: function(event) { var fd = this.formdata; var formData = new FormData(event.target); Vue.http.post('/path/to', formData).then(function(resp) { // success callback }, function (resp) { // error callback }); }, setSex:function(value){ this.formdata.sex = value; this.btnstate.nextDisabled = false; }, setInterest:function(value,checked){ if(value){ if(checked) this.formdata.interest.push(value); else{ index = this.formdata.interest.indexOf(value); if (index > -1) { Vue.delete(this.formdata.interest,index) } } } }, watchInterest:function(){ if(this.formdata.interest.length>0){ this.btnstate.nextDisabled = false; }else{ this.btnstate.nextDisabled = true; } }, watchSex:function(){ if(this.formdata.sex){ this.btnstate.nextDisabled = false; }else{ this.btnstate.nextDisabled = true; } }, watchIntroduce:function(){ if(this.formdata.introduce.length>30){ this.btnstate.submitDisabled = false; }else{ this.btnstate.submitDisabled = true; } }, setIntroduce :function(value){ this.formdata.introduce = value; }, prev:function(){ this.i=this.i-1; }, next:function(){ this.i=this.i+1; }, reset:function(){ } } });
6.具体使用index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> </head> <body> <form @submit.prevent="prevent" id="app"> {{formdata.sex}}-{{formdata.interest}}-{{formdata.introduce}} <div v-if="i==1" style="width: 100%;"> <span>1.请问你的性别:</span> <input-radios v-on:change="setSex" v-on:btnwatch="watchSex" :all-opts="sexs" :init-opt="formdata.sex"></input-radios> </div> <div v-if="i==2" style="width: 100%;"> <span>2.请选择你的兴趣爱好:</span> <input-checkboxs v-on:change="setInterest" v-on:btnwatch="watchInterest" :all-opts="interests" :init-opts="formdata.interest"></input-checkboxs> </div> <div v-if="i==3" style="width: 100%;"> <span>3.请介绍下自己:</span> <input-textarea v-on:change="setIntroduce" v-on:btnwatch="watchIntroduce" :content="formdata.introduce" :min-num="10"></input-textarea> </div> <div style="text-align: center; position: fixed; bottom: 0px; width: 100%"> <button @click="prev" v-if="i>1" style="width: 150px; height: 50px">上一步</button> <button @click="next" v-if="i<3" :disabled="btnstate.nextDisabled" style="width: 150px; height: 50px">下一步</button> <button @click="submit" type="submit" v-if="i==3" :disabled="btnstate.submitDisabled" style="width: 150px; height: 50px">提交</button> <button @click="reset" style="width: 150px; height: 50px">重置</button> </div> </form> <script src="https://unpkg.com/vue/dist/vue.min.js"></script> <script src="https://cdn.bootcss.com/vue-resource/1.5.0/vue-resource.min.js"></script> <script src="input-radios.js"></script> <script src="input-checkboxs.js"></script> <script src="input-textarea.js"></script> <script src="index.js"></script> </body> </html>
相关推荐
在Vue UI组件开发环境中,主要涉及以下几个关键知识点: 1. **Vue.js基础**:首先,你需要熟悉Vue.js的基本概念,如Vue实例、组件系统、指令、计算属性、生命周期钩子函数等。这些都是创建自定义UI组件的基础。 2....
Vue.js 是一款非常流行的前端框架,它以组件化开发为核心,极大地提高了开发效率。在处理大量数据或复杂页面时,可能会遇到初次加载时性能下降、页面卡顿的问题。为了解决这个问题,Vue 提供了一种策略,即延迟渲染...
首先,Vue组件是Vue.js的核心特性之一,它允许我们将UI分解为可重用的模块,每个模块都有自己的数据和逻辑。Slider组件通常包含以下几个关键部分: 1. **数据绑定**:Vue.js的双向数据绑定使得在组件内部和外部的...
通常,一个开源项目会包含以下几个部分: 1. `src`目录:存放源代码,可能包括主入口文件、组件定义、样式表、配置文件等。 2. `public`或`static`目录:存放静态资源,如图片、字体文件等。 3. `components`目录:...
一个基本的`vue-node`项目可能包含以下几个主要部分: 1. **src** - 这是存放所有源代码的地方,包括Vue组件。 2. **public** - 存放静态资源,如CSS、图片等。 3. **server** - Node.js服务端代码,负责处理HTTP...
【描述】"基于D3.js布局显示树的Vue组件"的实现通常包括以下几个步骤: 1. **引入D3.js**:首先需要在Vue项目中安装D3.js库,这可以通过npm或yarn完成。安装完成后,需要在组件中导入D3.js以便使用其提供的各种功能...
从压缩包的文件名 "audio-vue-master" 来看,这可能是该项目的源码仓库,其中可能包含以下几个主要部分: - `src` 目录:存放源代码,包括 Vue 组件、样式文件、脚本等。 - `dist` 目录:编译后的生产代码,可以...
实现这样的时间选择组件,开发者可能需要掌握以下几个核心概念和技术: 1. **Vue组件化开发**:将时间选择功能封装为独立的Vue组件,便于复用和维护。组件内部可能包括状态管理(如当前选中时间、选择范围等)和事件...
在JavaScript开发中,实现这样一个组件需要考虑以下几个关键点: 1. **数据结构**:日历组件需要维护一个表示月份和日期的数据结构,可能是一个二维数组,其中每个元素代表一天,并包含日期状态(如是否为周末、...
1. **组件化开发**:组件是Vue的核心,这个播放器组件封装了与视频流播放相关的逻辑和界面,可以方便地在其他Vue组件中复用。 2. **Composition API**:Vue3中的Composition API允许开发者更灵活地组织和重用逻辑...
在项目结构上,博客生成器可能包含以下几个部分: 1. **源文件**:存储Markdown格式的博客文章,每个文章对应一个Markdown文件。 2. **Vue组件**:包括全局组件和特定页面组件,如Header、Footer、ArticleList、...
Vue.js 是一款流行的前端JavaScript框架,它以轻量级、高效和可复用性而著称。在Vue项目中,创建一个刻度尺组件是...通过深入研究项目源码,你可以了解Vue组件开发的各个方面,这对于提升你的Vue.js技能非常有帮助。
4. **生命周期钩子**:Vue组件有自己的生命周期,从创建到销毁有多个阶段。我们可以利用这些钩子函数来执行特定任务。例如,在`mounted`钩子中,我们可以初始化键盘布局。 在实现过程中,我们还需要考虑以下几点: ...
Cron表达式是一种在各种操作系统中广泛使用的定时任务调度格式,它由7个字段组成,每个字段代表一个时间单位,从左到右分别是秒、分钟、小时、日期、月份中的日期、月份和星期几。每个字段可以设定一个或多个值,如...
创建基于CountUp.js的Vue组件通常涉及以下几个步骤: 1. **安装CountUp.js**:首先,需要通过npm或yarn将CountUp.js引入项目。在终端中运行`npm install countup.js`或`yarn add countup.js`。 2. **导入CountUp....
Vue-color-picker组件通常包含了以下几个关键知识点: 1. **组件化开发**:Vue.js的核心特性之一就是组件化,它允许我们将UI拆分成可重用的独立部分,颜色选择器组件就是一个典型的例子。通过创建一个自定义组件,...
这个项目的结构通常包括以下几个部分: 1. **src**:源代码目录,包含了项目的组件、样式、脚本等。 - **components**:存放自定义组件,如EmojiPanel.vue,用于展示可选择的emoji表情。 - **styles**:存放项目...
7. **生命周期钩子**:Vue组件有多个生命周期钩子函数,如`created`、`mounted`等,可以在组件的不同阶段执行代码,如初始化数据、挂载DOM元素等。 8. **状态管理**:对于复杂的应用,可能需要使用Vuex这样的状态...
总的来说,"vue对接海康播放器插件组件"涉及到Vue组件化开发、第三方库的引入与注册、组件属性绑定、事件监听以及与后端视频流的交互等多个知识点。通过合理的集成和配置,开发者可以在Vue应用中轻松实现监控视频的...
在"用于在vxetable表格中适配antdesignvue组件的渲染"这个主题中,主要涉及以下几个关键知识点: 1. **VxeTable**:VxeTable是一个基于Vue的高性能表格组件,它支持动态列、行操作、表头分组、合并单元格、树形数据...