Vue.js组件化开发实践

news/2024/12/24 10:03:28

什么是Vue.js

Vue.js 是一套构建用户界面的 渐进式框架。它非常容易与其它库或已有项目整合,而无须从头开始重构整个项目;另一方面,Vue 完全有能力驱动采用单文件组件来开发的更为复杂的单页应用。

目前在我参与开发维护的项目中已经使用上了Vue.js的一些基本功能,下面两幅图来自项目截图。

vue-in-cur-poj.png

vue-in-cur-poj-2.png

Vue.js基本功能

  • 视图元素响应式

  • 数据双向绑定,解放DOM操作

  • 只关注视图层,渐进式插件

视图元素响应式

//视图
<div id="app">{{msg}}</div>
//JS逻辑
var vm = new Vue({
  el: '#app',
  data: {
    msg: 'hello world'
  }
})

上图中,我们在视图里声明一个变量msg,它被包在一个双花括号"{{}}"中,以此表明它是一个Vue所管理的视图变量元素。同时,我们在JS中新建一个Vue对象,其中的el对应"#app",表示改Vue对象管辖的视图范围为id是app所对应的区域;data中有一个msg属性,对应视图中的双花括号变量msg。一旦我们新建好这个Vue对象,所有对于该对象data属性中的msg进行操作,会同步反应在视图中的{{msg}}上,这个视图变量元素即具有响应式。

数据双向绑定,解放DOM操作

  • 双向绑定:可以理解为JS逻辑中的数据的更改会实时的反映在视图上;同时任何从视图中过来的数据或者事件,能够实时的反映在逻辑中。

  • 一旦视图和逻辑之间规定好需要绑定的数据和事件,那么业务逻辑就能专注数据处理,而无需手动管理DOM,这样就实现了视图和逻辑各司其职。

一个例子:

输入框中的输入的字符串实时显示在视图上;同时当用户点击视图中的一个按钮时,视图中的字符串反向之后在输出到视图上。

DOM操作

//视图
<div id="app">
    <p id="msg"></p><input id="inputMsg" type="text">
    <p id="gsm"></p><button id="reverseMsg">Reverse</button>
</div>
//逻辑
document.getElementById('inputMsg').addEventListener('input', function({
  document.getElementById('msg').innerText = this.value
}), false)

document.getElementById('reverseMsg').addEventListener('click', function({
  var msg = document.getElementById('msg').innerText
  document.getElementById('gsm').innerText = msg.split('').reverse().join('')
}), false)

Vue处理

//视图
<div id="app">
    <p>{{msg}}</p><input v-model="msg" type="text">
    <p>{{gsm}}</p><button v-on:click="reverseMsg">Reverse</button>
</div>
//逻辑
var vm = new Vue({
    el: '#app',
    data: {
        msg: "",
        gsm: ''
    },
    methods: {
        reverseMsg: function(){
            this.gsm = this.msg.split('').reverse().join('')
        }
    }
})

Vue.js组件

  • 易维护

  • 易复用

组件系统是 Vue.js 另一个重要概念,因为它提供了一种抽象,让我们可以用独立可复用的小组件来构建大型应用。如果我们考虑到这点,几乎任意类型的应用的界面都可以抽象为一个组件树。

components-concept.png

一个自定义的按钮

<div id='app'>
  <wds-button></wds-button>
</div>

<template id='template-wds-button'>
  <button class="wds-button">默认按钮</button>
</template>
var wdsButton = {
  template: '#template-wds-button'
}

var vm = new Vue({
  el: '#app',
  components: {
    'wds-button': wdsButton
  }
})
父组件传递数据到子组件: props
<div id='app'>
  <wds-button></wds-button>
  <wds-button type="success" btn-name="成功按钮"></wds-button>
</div>

<template id='template-wds-button'>
  <button v-bind:class="['wds-button', type ? 'wds-button--' + type: '']">{{btnName}}</button>
</template>
var wdsButton = {
    props: {
        btnName: {
            type: String,
            default: '默认按钮'
        },
        type: {
            type: String,
            default: ''
        }
    },
    template: '#template-wds-button'
}

var vm = new Vue({
  el: '#app',
  components: {
    'wds-button': wdsButton
  }
})
was-button 组件描述

Props

参数说明类型可选值默认值
btnName按钮名字String默认按钮
type按钮类型Stringsuccess/warning/danger
子组件将数据传回父组件:自定义Event
<div id='app'>
  <wds-button v-on:wds-button-click-event="alertButtonName" type="warning" btn-name="警告按钮"></wds-button>
</div>

<template id='template-wds-button'>
  <button class="wds-button" v-bind:class="['wds-button', type ? 'wds-button--' + type: '']" v-on:click="wdsButtonClick">{{btnName}}</button>
</template>
var wdsButton = {
    props: {
        btnName: {
            type: String,
            default: '默认按钮'
        },
        type: {
            type: String,
            default: ''
        }
    },
    methods: {
      wdsButtonClick: function(){
        this.$emit('wds-button-click-event', this.btnName, this.type)
      }
    },
    template: '#template-wds-button'
}

var vm = new Vue({
  el: '#app',
  components: {
    'wds-button': wdsButton
  },
  methods: {
    alertButtonName: function(btnName, type){
      alert(btnName)
    }
  }
})
was-button 组件描述

Props

参数说明类型可选值默认值
btnName按钮名字String默认按钮
type按钮类型Stringsuccess/warning/danger

events

事件名称说明回调参数
wds-button-click-event点击按钮回调事件btnName, type

Vue.js单文件组件

  • 组件应该内聚自己的样式(HTML/CSS)和逻辑(JS)

  • 一个组件对应一个文件

文件和组件一一对应: .vue文件

vue-file-sample.png

.vue文件无法直接运行在浏览器上,通过webpack + vue-loader的方式来将Vue组件转化为JS模块。

  • webpack: 前端资源模块化管理打包工具。

  • vue-loader: webpack下处理.vue文件的的插件。

一个例子:

一个页面中有多个按钮,每点击一个按钮弹出toast信息,按钮toast都自定义。代码可以下载这里。

vue-webpack-demo-directory.png

小结

前端技术日新月异,如果你今年还没开始学某门技能,明年就可以用不学它了。

end-emoji.jpeg


http://www.niftyadmin.cn/n/2096515.html

相关文章

华为软件编程规范和范例 注释

2-1 &#xff1a;一般情况下&#xff0c;源程序有效注释量必须在20 &#xff05;以上 说明&#xff1a;注释的原则是有助于对程序的阅读理解&#xff0c;在该加的地方都加了&#xff0c;注释不宜太多也不能太少&#xff0c;注释语言必须准确、易懂、简洁。 2-2 &#xff1a;说明…

[转]c的fopen()打开文件的模式,第二个参数

C语言函数fopen函数简介  函数功能&#xff1a; 打开一个文件 函数原型&#xff1a;FILE * fopen(const char * path,const char * mode); 相关函数&#xff1a;open&#xff0c;fclose&#xff0c;fopen_s[1] &#xff0c;_wfopen 所需库&#xff1a; <stdio.h> 返回值…

NSArray,NSSet,NSDictionary总结

2011-07-21NSArray,NSSet,NSDictionary总结博客分类&#xff1a; iphone三种集合类来收集cocoa对象&#xff08;NSObject对象&#xff09;&#xff1a;NSArray 用于对象有序集合&#xff08;相当于是数组&#xff09;NSSet 用于对象无序集合NSDictionary用于键值映射以上三种集…

魅族mx四核 无法发送短信

更新了最新的系统&#xff0c;flyme 1.1.5 尽然无法发短信&#xff0c;我勒个去 &#xff01; 经过一段度娘的痛苦折磨&#xff0c;终于找到了解决方案。 原来是魅族的短信中心没有自动设置&#xff0c;必须进入短信的主界面&#xff0c;点击设置按钮&#xff0c;拉到最下面&am…

1101: [POI2007]Zap

1101: [POI2007]Zap Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2405 Solved: 987[Submit][Status][Discuss]Description FGD正在破解一段密码&#xff0c;他需要回答很多类似的问题&#xff1a;对于给定的整数a,b和d&#xff0c;有多少正整数对x,y&#xff0c;满足x&l…

module中function variable是否导出总结

首先必须明确&#xff0c;module生成的.ko文件中的全局变量&#xff0c;函数名在insmod之前还没有被重定位&#xff0c;也就是在加载的时候&#xff0c;才被分配了地址&#xff0c;进行了重定位。 1 insmod rmmod时候&#xff0c;调用init, exit.使用宏module_init(init), modu…

Golang1.7 Goroutine源码分析(转)

2019独角兽企业重金招聘Python工程师标准>>> 一、 Golang简介 1.1概述 Golang语言是Google公司开发的新一代编程语言&#xff0c;简称Go语言&#xff0c;Go 是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用&#xff0c;而新奇的…