Vue初识:一个前端萌新的总结
一、前言
时隔三年,记得第一次写博客还是2015年了,经过这几年的洗礼,我也从一个后端的小萌新变成现在略懂一点点知识的文青。如今对于前端的东东也算有一知半解,个人能力总的来说,也能够独立开发产品级项目吧。至于为什么会前端的东西,估计学.NET的人应该大部分都懂些,之前自己搭建过一套框架,但觉得现在的时代趋势吧,前后端分离是主流,再加上想借这次机会改变部门的开发方式,所以就打算改造一下。
本文仅为个人心得,从实践项目出发,不讲理论,适合萌新学习,如果有说错了欢迎大家在评论区指出,共同进步,哈哈。
这里假定大家的前端技术都达到了熟练使用JavaScript、Html和CSS的地步。
二、起步
2.1 Vue入门需要知道的一些基础知识
- 这是一套用于构建用户界面的MVVM框架,但有些时候却又无法实现双向绑定(需要一些特殊处理,比如子组件更新父组件的属性)
- 非常容易入门,使用OO思想会让你更加发现这套框架在应用上的简单(组件化开发)
- 使用模板语法(Template),在使用的时候就像写html一样
- Vue有两种声明形式(全局、区域)后面会解释
- Vue这款框架十分霸道,使用之后会发现以前用的Jquery/Bootstrap会被排斥得很厉害(可是我又很不想放弃这两者一些生态里的东西,怎么办?毕竟Vue现在的生态还不是很好。答案是:不使用vue-cli构建的时候,只能在它的生命周期中创建使用,勉强兼容,但是有代码洁癖的话就会很不舒服。如果使用vue-cli构建之后,通过NPM就可以获取bootstrap-vue、fontawesome-vue等针对vue开发的新东东)
- 萌新入门,还是按照官方说法,先不要用vue-cli去构建项目(这种感觉对于我这种后端小渣渣是最为清楚,使用之后瞬间感觉前端这几年变得极度复杂,貌似这样显得逼格更高?)
- 下面就让我们一步步从简单的html+js引用的方式使用vue吧,基础的使用方式在Vue官网里都有,此处就不再对那些内容重写一遍了。
2.2 Vue页面级组件的基本结构(每一个页面对象都大同小异,根据实际需要取舍部分对象属性即可,记住了就懂了一半)
var Test = new Vue({ el: '#test-vm', // 此处对应html页面中一个id=test-vm的元素,必须指定 data: { id: 0 // data是组件内部维护的属性对象 }, computed: { newid: function () { return this.id === 0 // 此处返回一个boolean值,computed是计算属性的集合体,里面每一个属性都是function,因此数据更新时,也会更新对应的视图数据 } }, methods: { Test: function () { // 方法1内容 }, Test2: function () { // 方法2内容 } }, components: { 'test-input': TestInput // components 是子组件容器,在这里引入其他要使用的子组件,多个用,分隔。格式为:'组件名':组件对象 (组件名可以自定义,但要和html对应) }, created: function () { // 组件生命周期,此时可以对实例的数据做一些操作,比如用ajax请求数据 }, mounted: function () { // 组件生命周期,执行到这里说明整个组件已经渲染完成,在这里你可以执行一些其他操作,比如实例一个bootstrap-datetimepicker组件 }, template: '<div>这是测试内容</div>' // 这是组件的模板,也就是这里的内容会被加载在上面el指定的#test-vm元素中,这里要注意的是template必须只有一个root。 // 你不能写成<div>标题内容</div><div>主体内容</div>,只能加多一层<div><div>标题内容</div><div>主体内容</div></div> });
2.3 Vue组件的基本结构(每一个组件都大同小异,根据实际需要取舍部分对象属性即可)
// 这是全局声明组件,这样每一个引用的组件的components都会默认添加这个组件,就不需要再像上面一样手动添加 // 局部声明格式为: var TestInput = { 此处的内容和组件声明一样 } // 此处实现了一个文本框(多行/水印/密码模式/最大值限制/默认值/禁用) Vue.component('test-input', { props: ['type','placeholder','disabled','multiple', 'maxlength', 'val'], data: function () { // 此处的data和页面级组件的data不同,这里是一个function,需要把内部维护的属性通过对象的方式return return { value: '', isError: false, errorMsg: '' } }, computed: { contentLength: function () { return this.value.length; }, typeObject: function () { return this.type ? this.type : 'text'; } }, watch: { // watch是监视器,可以监视组件内部的属性变化并做出相应处理,属性命名必须和data或者computed中的属性一致 contentLength: function (val, oldVal) { if (this.maxlength && val > this.maxlength) { this.value = this.value.substring(0, this.maxlength); } }, val: function (val, oldVal) { if (val) this.value = val; } }, created: function () { if (this.val) this.value = this.val; }, template: '<div class="input-box">' + '<input :disabled="disabled" :type="typeObject" class="form-control" v-if="!multiple" :placeholder="placeholder" v-model="value"/>' + '<textarea :disabled="disabled" class="form-control" v-else :placeholder="placeholder" v-model="value"></textarea>' + '<div v-if="isError">' + '<div>{{errorMsg}}</div>' + '<div class="arrow"></div>' + '</div>' + '<i class="fas fa-exclamation-circle fa-lg" v-if="isError" ></i>' + '<span class="count" v-if="maxlength">{{value.length}}/{{maxlength}}</span>'+ '</div>' });
2.4 子组件更新父组件属性与父组件控制子组件内容
// 父组件改变子组件的内部属性 // 父组件内部的属性通过子组件的props属性进行传递,当父组件属性值发生改变时,会相应更新子组件视图,如: // 必须先声明子组件,才能声明父组件 var TestInput = { props: ['type'], template:'<input :type="type" ></input>' } var view = new Vue({ el:'#test-vm', data:{ inputType: 'text' }, methods:{ visibleInputText: function () { // 该方法用于转换子组件文本框的文本类型(密码/明文) this.inputType === 'text'? this.inputType = 'password' : this.inputType = 'text' } }, components:{ 'test-input':TestInput }, template:'<div>'+ '<button @click="visibleInputText">点击我修改文本框类型 </button><test-input :type="inputType"></test-input>'+ '</div>' })
// 子组件更新父组件中的属性 // 子组件通过$emit来将内部的属性传递给父组件中的方法,并通过父组件内部方法来实现更新。简单点来说就是一个委托方法: // 1.子组件内部声明委托方法名以及将数据传递给$emit(变相地给自己增加了一个隐式方法) // 2.父组件通过绑定子组件声明的委托方法名把自己的方法传递给子组件 var TestInput = { data: function () { return { value: '' } }, methods: { textChange: function () { // $emit 接受[委托方法名,传递参数]两个参数 // 所谓的委托方法名,其实就是父组件中给子组件添加绑定的方法名称 // 委托方法是一个单参数方法 this.$emit('ontextchange',this.value) } }, template:'<input v-model="value" @onchange="textChange"></input>' } var parent = new Vue({ el: '#text-vm', data: { childContent: '' // 子组件文本框的值 }, methods: { onTextChange: function (value) { // 该方法就是委托的方法,value为子组件传递的参数 console.log(value) this.childContent = value } }, components: { ‘test-input’: TestInput }, template: '<test-input @ontextchange="onTextChange" ></test-input>' // 上面的ontextchange必须和子组件在$emit中声明的一致 })
Vue初识:一个前端萌新的总结的更多相关文章
- hbuilderX创建vue项目之添加router路由(前端萌新)
作为一个刚刚接触前端不久的新人来说,熟悉了一种目录结构或者项目创建方法以后,恨不得一辈子不会变! 可是人要生活,就要工作,既然是打工,当然要满足雇佣者的要求. 今天我来说说 hbuilderX 这个开 ...
- 前端萌新眼中的Promise及使用
一个 Promise 就是一个代表了异步操作最终完成或者失败的对象.这是MDN上关于Promise的解释.在前端开发中,Promise经常被拿来用于处理异步和回调的问题,来规避回调地狱和更好排布异步相 ...
- ...续上文(一个小萌新的C语言之旅)
我们继续上次没介绍完的继续讲: 下面我们说一下二进制,二进制是计算技术中广泛采用的一种 数制. 二进制数据是用0和1两个 数码来表示的数.它的基数为2,进位规则是“逢二进一”.那么二进制怎么转化为十进 ...
- 一个DBA萌新的烦恼
莫名其妙也好机缘巧合也罢,现在我成为了一名MySQL DBA. 为什么: 1.为什么leader让我转到DBA? 首先,我本身学习运维管理的时候就接触过数据库(mysql,redis),算是自身的优势 ...
- 萌新--关于vue.js入门及环境搭建
十几天闭关修炼,恶补了html跟css以及JavaScript相应的基础知识,恰巧有个群友准备做开源项目,愿意带着我做,但是要求我必须懂vue.js,所以开始恶补vue.js相关的东西. 在淘宝上买了 ...
- 萌新web前端从零开始(1)——计算机入门
前言:这是一个萌新从零开始的学习之路,与大家分享自己的看法与见解,还请指出错误与遗漏点方便改正. 1.认识计算机. 计算机语言常见的有C,PHP,Ruby,Java,C#,Basic,JS,C++等, ...
- day 81 Vue学习一之vue初识
Vue学习一之vue初识 本节目录 一 Vue初识 二 ES6的基本语法 三 Vue的基本用法 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 vue初识 vue称为渐进式js ...
- day 80 Vue学习一之vue初识
Vue学习一之vue初识 本节目录 一 Vue初识 二 ES6的基本语法 三 Vue的基本用法 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 vue初识 vue称为渐进式js框架 ...
- 给萌新HTML5 入门指南
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员 ...
随机推荐
- 第一个Maven工程的目录结构和文件内容及联网问题
[第一个Maven工程] ①目录结构 Hello |---src |---|---main |---|---|---java |---|---|---resources |---|---test |- ...
- 54. spring boot日志升级篇—logback【从零开始学Spring Boot】
在<44. Spring Boot日志记录SLF4J>章节中有关相关的介绍,这里我们在深入的了解下logback框架. 为什么要使用logback ? --在开发中不建议使用System. ...
- DJANGO中如何用邮箱来登陆?
就是另一个不同的登陆backend. 而DJANGO会尝不同的方式,哪个成功就用哪个 authentication.py from django.contrib.auth.models import ...
- 2102 石子归并 2codevs
2102 石子归并 2codevs 题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为 ...
- docker: 定时检查docker container的运行状态并发邮件报警
首先创建一个发送邮件的bash脚本 - send_mail.sh: #!/bin/bash curl -s --user 'api:key-xxxxxxxxxxxxx' \ https://api.m ...
- Codeforces 91C Ski Base 加边求欧拉回路数量
题目链接:点击打开链接 题意: 给出n个点m条无向边的图 開始图里没有边.每次加一条边,然后输出图里欧拉回路的条数. 思路: We will count the number of ski bases ...
- 百度LBS云搜索时报错 "filter:area is not filteable field, please set property in the cloud-storage
{"status":2,"message":"filter:area is not filteable field, please set prope ...
- c++ 编译器会绕过拷贝构造函数
C++ primer P442 P447:在拷贝初始化过程中,编译器可以跳过拷贝构造函数,直接创建对象.即,编译器允许将下面的代码 "; //1 改写为 "); //2 由于str ...
- 网络安全中机器学习大合集 Awesome
网络安全中机器学习大合集 from:https://github.com/jivoi/awesome-ml-for-cybersecurity/blob/master/README_ch.md#-da ...
- Set的非重复判断是根据什么判断的
HashSet 首先来看下HashSet的add()这个方法的源代码: public boolean add(E e) { return map.put(e, PRESENT)==null; } 由此 ...