一、前言

  时隔三年,记得第一次写博客还是2015年了,经过这几年的洗礼,我也从一个后端的小萌新变成现在略懂一点点知识的文青。如今对于前端的东东也算有一知半解,个人能力总的来说,也能够独立开发产品级项目吧。至于为什么会前端的东西,估计学.NET的人应该大部分都懂些,之前自己搭建过一套框架,但觉得现在的时代趋势吧,前后端分离是主流,再加上想借这次机会改变部门的开发方式,所以就打算改造一下。

  本文仅为个人心得,从实践项目出发,不讲理论,适合萌新学习,如果有说错了欢迎大家在评论区指出,共同进步,哈哈。

  这里假定大家的前端技术都达到了熟练使用JavaScript、Html和CSS的地步。

二、起步

  2.1 Vue入门需要知道的一些基础知识

  1. 这是一套用于构建用户界面的MVVM框架,但有些时候却又无法实现双向绑定(需要一些特殊处理,比如子组件更新父组件的属性)
  2. 非常容易入门,使用OO思想会让你更加发现这套框架在应用上的简单(组件化开发)
  3. 使用模板语法(Template),在使用的时候就像写html一样
  4. Vue有两种声明形式(全局、区域)后面会解释
  5. Vue这款框架十分霸道,使用之后会发现以前用的Jquery/Bootstrap会被排斥得很厉害(可是我又很不想放弃这两者一些生态里的东西,怎么办?毕竟Vue现在的生态还不是很好。答案是:不使用vue-cli构建的时候,只能在它的生命周期中创建使用,勉强兼容,但是有代码洁癖的话就会很不舒服。如果使用vue-cli构建之后,通过NPM就可以获取bootstrap-vue、fontawesome-vue等针对vue开发的新东东)
  6. 萌新入门,还是按照官方说法,先不要用vue-cli去构建项目(这种感觉对于我这种后端小渣渣是最为清楚,使用之后瞬间感觉前端这几年变得极度复杂,貌似这样显得逼格更高?)
  7. 下面就让我们一步步从简单的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初识:一个前端萌新的总结的更多相关文章

  1. hbuilderX创建vue项目之添加router路由(前端萌新)

    作为一个刚刚接触前端不久的新人来说,熟悉了一种目录结构或者项目创建方法以后,恨不得一辈子不会变! 可是人要生活,就要工作,既然是打工,当然要满足雇佣者的要求. 今天我来说说 hbuilderX 这个开 ...

  2. 前端萌新眼中的Promise及使用

    一个 Promise 就是一个代表了异步操作最终完成或者失败的对象.这是MDN上关于Promise的解释.在前端开发中,Promise经常被拿来用于处理异步和回调的问题,来规避回调地狱和更好排布异步相 ...

  3. ...续上文(一个小萌新的C语言之旅)

    我们继续上次没介绍完的继续讲: 下面我们说一下二进制,二进制是计算技术中广泛采用的一种 数制. 二进制数据是用0和1两个 数码来表示的数.它的基数为2,进位规则是“逢二进一”.那么二进制怎么转化为十进 ...

  4. 一个DBA萌新的烦恼

    莫名其妙也好机缘巧合也罢,现在我成为了一名MySQL DBA. 为什么: 1.为什么leader让我转到DBA? 首先,我本身学习运维管理的时候就接触过数据库(mysql,redis),算是自身的优势 ...

  5. 萌新--关于vue.js入门及环境搭建

    十几天闭关修炼,恶补了html跟css以及JavaScript相应的基础知识,恰巧有个群友准备做开源项目,愿意带着我做,但是要求我必须懂vue.js,所以开始恶补vue.js相关的东西. 在淘宝上买了 ...

  6. 萌新web前端从零开始(1)——计算机入门

    前言:这是一个萌新从零开始的学习之路,与大家分享自己的看法与见解,还请指出错误与遗漏点方便改正. 1.认识计算机. 计算机语言常见的有C,PHP,Ruby,Java,C#,Basic,JS,C++等, ...

  7. day 81 Vue学习一之vue初识

      Vue学习一之vue初识   本节目录 一 Vue初识 二 ES6的基本语法 三 Vue的基本用法 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 vue初识 vue称为渐进式js ...

  8. day 80 Vue学习一之vue初识

    Vue学习一之vue初识   本节目录 一 Vue初识 二 ES6的基本语法 三 Vue的基本用法 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 vue初识 vue称为渐进式js框架 ...

  9. 给萌新HTML5 入门指南

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员 ...

随机推荐

  1. Codeforces 934D/933B - A Determined Cleanup

    传送门:http://codeforces.com/contest/934/problem/D 给定两个正整数p(p≥1).k(k>1).多项式f(x)的系数的取值集合为{0,1,2,...,k ...

  2. enum 的使用

    public enum Color { RED(), GREEN(), BLANK(), YELLO(); // 成员变量 private String name; private int index ...

  3. Git学习总结(14)——Git使用前的注意事项

    连接方式https.ssh 在使用git的时候,不管你的服务器是开源平台github还是私服gitlab,你都需要clone仓库到本地,这个clone的时候就需要你选择连接方式.这个连接方式决定了你与 ...

  4. [COGS311] Redundant Paths

    ★★☆   输入文件:rpaths.in   输出文件:rpaths.out   简单对比 时间限制:1 s   内存限制:128 MB Description In order to get fro ...

  5. xcode5修改APP名字

    bundle display name 配置文件里面设置, 这个指的是显示在icon下面的名字.application name在itunes connect上改, 是指显示在app store上的名 ...

  6. Intellij IDEA安装插件

    从Eclipse到Intellij IDEA换过来,还是没有适应,并且电脑异常的卡顿,4核4G内存的机器表示伤不起.Intellij IDEA还有待我进行调教. 今天说明一下怎样安装插件.以keyPr ...

  7. SQL 为SQL Server服务指定的凭据无效怎么办

    如下所示,在安装SQL Server2008的时候,我随便输入了了账户名和密码,点击下一步没用   正确做法是:点击账户名右边的小三角,从下拉列表随便选一个("对所有SQL Server服务 ...

  8. 查看及更改MySQL数据库物理文件存放的位置

    查看命令:   mysql> show global variables like "%datadir%"; 表格第二行即为文件的位置.另外,可以在该文件夹的配置文件my.i ...

  9. Android中不同方向嵌套滑动的解决方式(ListView为样例)

    前言: 就像手机QQ的聊天消息列表.一个纵向滑动的ListView列举全部消息,但每一条消息能够横向滑动. 而默认情况下,仅仅能有一个地方消化处理触摸事件,要么ListView吃掉这个事件.要么子It ...

  10. Cocos2d-x v3.0正式版尝鲜体验【2】 Android平台移植

    今天没事又尝试了下3.0正式版关于Android平台的移植,把新建的项目移植了下.过程仅用了十分钟左右,什么概念?! 好吧,事实上我想说,这个版本号真的移植非常轻松啊,只是还没加上其它东西,只是就眼下 ...