找个了题目<<问卷调查>>
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对接海康播放器插件组件
Vue组件开发套件受到启发 :smiling_face_with_heart-eyes: 。 VCDK中的所有内容都应放在其自己的包装中,并且本身就是消耗品。使用此存储库该存储库正在使用 。 当前的lerna配置尚未完全完成-我希望看到某些方面的...
最近就有一些小伙伴问我,vue组件之间是如何传递参数的?其实vue是有三种方式可以组件之间传递数据(props,组件通信,slot),这次就说第一种方式如下: a父组件内容: 引入b子组件import b form ‘b.vue’
选择第二个日期范围不集成:使用自己喜欢的vue组件或js库进行DIY Bootstrap 4样式(需要Bootstrap 4 CSS)返回Moment.js实例(需要moment.js)安装npm install- -save @ owumaro / vue-date-range-picker用法Webpack...
Vue是一个JavaScript框架,用于构建交互式Web界面。它通过组件化开发来提升开发效率和可复用性。Vue通过简单并灵活的API来提供响应式和组件化的数据绑定机制。它还提供了许多工具和插件,使开发变得更加容易。Vue...
vue-component-creator 一个头脑风暴插件,用于创建带有 Sass 文件的单个文件 vue.js 组件并完成 vuex 模块。 这个插件做了几件事情,以简化您的开发经验。... 通过创建新的Vuex模块,将生成几个文件。 结构 模块名称
VUE+element-ui开发出的美观好看的登录/注册模板组件 集成方便,本人耗时好几周才完成的, 头发掉了不少, 4.9买不了吃亏买不了上当.请我加个鸡腿吧. 效果图博客地址: ...
Element介绍:不知道同学们还否记得我们之前讲解的前端开发模式MVVM,我们之前学习的vue是侧重于VM开发的,主 ...件,至于其他组件同学们可以通过我们这几个组件的学习掌握到ElementUI的学习技巧,然后课后自行 学习。
每个组件都有一个单独的组件文件夹,组件文件夹下都至少包含”index.vue”,”example.vue”,”readme.md”这三个文件,这几个文件都是通过创建组件传递的参数加指定的模板生成,创建组件的命令如下: npm run ...
主要介绍了使用form-create动态生成vue自定义组件和嵌套表单组件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
一、概念 什么是组件: 组件 就是将复杂的页面中重复的部分进行拆分 拆分成一块块可复用的小部分 ...页面中需要展示几个 那么就渲染几次 二、创建组件 1、创建全局组件 全局组件 就是代码中所有的Vue
在具体编写组件实例代码前,我们先来如下几个约定: 所有组件基于单文件组件,即一个 .vue文件就是一个组件 data 必须为一个函数 template 节点下只能有一个子节点 约束不多,但最后两个需要牢记在心。 基于单...
在实现目录组件时,我们需要考虑到以下几个属性: cmdList: 用于传入目录数据,包含了目录的结构信息。 customStyle: 用于自定义组件的样式。 className: 用于设置组件的类名,影响组件的展示样式。
一开始接触到vue中的组件的时候,对于组件的理解还是不够充分的,最近在开发个人博客项目中,一开始就没准备使用一些现在比较流行的UI库(毕竟是个人项目,多练练手还是好的),所以需要自己开发几个全局组件,这里...
修改主要涉及以下几个点: 删除一些不必要的逻辑 支持PC端,移动端 使用了 进行打包 js/css/images/*.vue 简单使用了 vue.js 对原有代码进行了拆分和封装, 支持所有vue版本 把源码中一些常用可配置的部分抽了出来 ...
为什么推荐使用JSX开发Vue3 在很长的一段时间中,Vue 官方都以简单上手作为其推广的重点。这确实给 Vue 带来了非常大的用户量,尤其是最追求需求开发... 在开始说我个人的观点之前,我们先来看几个事实: 一是:
wxWarse解决todo帖子评论、回复功能帖子收藏和取消收藏功能评论点赞和收藏的UI同步帖子详情页加载评论时惰性渲染和回到顶部编辑自己发过的主题展示未读消息数和消息已读部分页面添加下拉刷新主页几个tab切换有点bug ...
这个模板是基于 Vue3 和 Cesium 开发的一个天地图三维地球应用。在组件挂载后,通过 Cesium.Viewer 创建了一个三维地球实例,并设置了一系列的界面控件和参数,例如动画小组件、底图组件、全屏组件、时间轴等。接着...
前端组件化开发已经是一个老生常谈的话题了,组件化让我们的开发效率以及维护成本带来了质的提升。 当然因为现在的系统越来越复杂庞大,所以开发与维护成本就变得必须要考虑的问题,因此滋生出了目前的三大前端框架 ...