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的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员 ...
随机推荐
- L2-011. 玩转二叉树(不建树)
L2-011. 玩转二叉树 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整 ...
- Python基础(六) 基础文件操作
今天学习python下对文件的基础操作,主要从open函数.File对象的属性.文件定位.简单操作.举例说明几个步骤开始学习,下面开始进入今天的主题: 一.open函数介绍 open函数主要是打开一个 ...
- 关于zookeeper和zkfc的一些测试
1.停掉zookeeper集群 ****进程影响****** zkfc:报错无法连接zookeeper.ClientCnxn java.net.connectexception:拒绝连接,但不会shu ...
- Codeforces 121A Lucky Sum
Lucky Sum Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Origi ...
- [K/3Cloud]关于"选单"操作
之前有些人对这块有些疑问,比如: 1.选单操作是否和下推基本一样,都是公用同一套单据转换规则,只不过下推是源单推目标单,选单是目标单去选择源单,最终操作结果一样? 2,我想实现选单的时候,选单列表先通 ...
- [bzoj4033][HAOI2015]树上染色_树形dp
树上染色 bzoj-4033 HAOI-2015 题目大意:给定一棵n个点的树,让你在其中选出k个作为黑点,其余的是白点,收益为任意两个同色点之间距离的和.求最大收益. 注释:$1\le n\le 2 ...
- Asp.Net页面生命周期[转]
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
- Docker: Docker容器之间互相通信
最简单的方法,关闭防火墙(只建议用于开发环境) systemctl stop firewalld
- nodejs shell
REPL (Read-eval-print loop),即输入—求值—输出循环.如果你用过 Python,就会知道在终端下运行无参数的 python 命令或者使用 Python IDLE 打开的 sh ...
- CN Internet
来自为知笔记(Wiz)