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-012. 关于堆的判断(STL中heap)
L2-012. 关于堆的判断 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y ...
- 【Codeforces 1037D】Valid BFS?
[链接] 我是链接,点我呀:) [题意] 让你判断一个序列是否可能为一个bfs的序列 [题解] 先dfs出来每一层有多少个点,以及每个点是属于哪一层的. 每一层的bfs如果有先后顺序的话,下一层的节点 ...
- Windows学习总结(8)——DOS窗口查看历史执行过的命令的三种方式
在DOS窗口执行了一些列命令完成某项工作后,如果要查看都执行了那些命令,该如何办呢?(前提:DOS窗口未关闭的情况下) 一.方法一: 使用↑↓箭头上下翻看执行过的命令,此方式适宜执行命令较少的情况. ...
- HTTP 请求的 GET 与 POST 方式的区别
HTTP 请求的 GET 与 POST 方式的区别 在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST. GET - 从指定的资源请求数据. POST - 向指定的资源 ...
- HDU 1085 多重背包转化为0-1背包问题
题目大意: 给定一堆1,2,5价值的硬币,给定三个数表示3种价值硬币的数量,任意取,找到一个最小的数无法取到 总价值为M = v[i]*w[i](0<=i<3) 那么在最坏情况下M个数都能 ...
- JAVA学习课本内容总结
二.基本类型 数组 枚举 1.基本类型 逻辑类型 boolean (true/false) 整数类型 byte(8位) short(16) int(32) long(64) 浮点类型 float ...
- springboot整合dubbo的简单案例
使用框架: jdk 1.8 springboot-2.1.3 dubbo-2.6 spring-data-jpa-2.1.5 一.开发dubbo服务接口: 按照Dubbo官方开发建议,创建一个接口项目 ...
- Servlet通过JavaBean传值到JSP页面
主要通过Attribute进行传递,主要代码如下: 赋值,并定义跳转的页面: request.setAttribute("user", user); request.getRequ ...
- Js跨一级域名同步cookie
1. 纯Js同步两个域名下的cookie document.cookie = "name=" + "value;" + "expires=" ...
- Mysql常用索引及优化
索引是帮助我们快速获取数据的数据结构.索引是在存储引擎中实现的,因此不同存储引擎的索引也不同.这里只介绍InnoDB存储索引所支持的BTree索引: 一.索引类型 为了方便举例子,先创建表person ...