APP开发平台 > Blog > vue框架特点及其与其他框架对比

Vue是一套用于构建用户界面的渐进式框架。


比其他框架-React


React 和 Vue 有许多相似之处,它们都有使用 Virtual DOM;提供了响应式(Reactive)和组件化(Composable)的视图组件。将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库。React 比 Vue 有更丰富的生态系统


都有支持native的方案,React的RN,vue的Wee下


都支持SSR服务端渲染


都支持props进行父子组件间的通信


性能方面:React 和 Vue 在大部分常见场景下都能提供近似的性能。通常 Vue 会有少量优势,因为 Vue 的 Virtual DOM 实现相对更为轻量一些。


不同之处就是:


数据绑定方面,vue实现了数据的双向数据绑定,react数据流动是单向的

virtual DOM不一样,vue会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树.而对于React而言,每当应用的状态被改变时,全部组件都会重新渲染,所以react中会需要shouldComponentUpdate这个生命周期函数方法来进行控制

state对象在react应用中不可变的,需要使用setState方法更新状态;在vue中,state对象不是必须的,数据由data属性在vue对象中管理(如果要操作直接this.xxx)

组件写法不一样, React推荐的做法是 JSX , 也就是把HTML和CSS全都写进JavaScript了,即'all in js'; Vue推荐的做法是webpack+vue-loader的单文件组件格式,即html,css,js写在同一个文件


对比其他框架-angular

在性能方面,这两个框架都非常的快,我们也没有足够的实际应用数据来下一个结论。如果你一定想看些数据的话,你可以参考这个第三方跑分。单就这个跑分来看,Vue 似乎比 Angular 要更快一些。


在大小方面,最近的 Angular 版本中在使用了 AOT 和 tree-shaking 技术后使得最终的代码体积减小了许多。但即使如此,一个包含了 vuex + vue-router 的 Vue 项目 (30kb gzipped) 相比使用了这些优化的 Angular CLI 生成的默认项目尺寸 (~130kb) 还是要小的多。


灵活性:Vue 相比于 Angular 更加灵活,Vue 官方提供了构建工具来协助你构建项目,但它并不限制你去如何组织你的应用代码。有人可能喜欢有严格的代码组织规范,但也有开发者喜欢更灵活自由的方式。

 


vue.js的核心特点—响应的数据绑定

传统的js操作页面:在以前使用js操作页面的时候是这样的,需要操作某个html元素的数据,就的使用js代码获取元素然后在处理业务逻辑。


响应式数据绑定的方式操作页面,可以直接使用像下面代码那样的写法就可以将数据填充到页面中。


<template>

  <div id="app">

    {{ message }}

  </div>

</template>

 

<script>

export default {

  name: 'app',

  data () {

    return {

      message: 'Welcome to Your Vue.js App'

    }

  }

}

</script>

 

<style>

</style>

 


vue.js的核心特点—可组合的视图组件

一个页面映射为组件树。划分组件可维护、可重用、可测试,也就是一个页面由多个组件组合而成


vue中实现组件引入示例


第一步:import导入需要引入的组件文件;


第二步:注册组件;


第三步:在需要引入组件的文件中加上组件标签(这个标签的标签名就是注册的组件名字,多个单词的和这里有xx-xx的形式)


需要注意的是:组件可以嵌套引入,也就是说组件可以引入其他组件


首先创建一个组件,用于被引入的组件,组件名字叫Hello.vue


<template>

  <div>

    <h2>Essential Links</h2>

  </div>

</template>

 

<script>

export default {

  name: 'hello'

}

</script>

 

<!-- Add "scoped" attribute to limit CSS to this component only -->

<style scoped>

 

</style>

然后在需要引入的组件中,先使用import导入组件


import Hello from './components/Hello'

然后使用components注册这个组件


components: {

    Hello

}

 在需要引入组件的文件中加上组件标签(这个标签的标签名就是注册的组件名字,多个单词的和这里有xx-xx的形式)


<hello></hello>

<template>

  <div id="app">

    {{ message }}

    <hello></hello>

  </div>

</template>

 

<script>

  import Hello from './components/Hello'

  export default {

    name: 'app',

    data () {

      return {

        message: 'Welcome to Your Vue.js App'

      }

    },

    components: {

      Hello

    }

  }

</script>

 

<style>

</style>

单文件组件:Js,css,html 存在一个文件中,是一个单文件组件,下面vue模板文件里的Hello.vue就是一个单文件组件


<template>

  <div>

    <h2>{{ msg }}</h2>

  </div>

</template>

 

<script>

export default {

  name: 'hello',

  data () {

    return {

      msg: 'Hello Vue'

    }

  }

}

</script>

 

<!-- Add "scoped" attribute to limit CSS to this component only -->

<style scoped>

h1, h2 {

  font-weight: normal;

}

</style>

 

vue.js的核心特点—虚拟DOM


虚拟DOM的概述


运行的js速度是很快的,大量的操作DOM就会很慢,时常在更新数据后会重新渲染页面,这样造成在没有改变数据的地方也重新渲染了DOM节点,这样就造成了很大程度上的资源浪费。


利用在内存中生成与真实DOM与之对应的数据结构,这个在内存中生成的结构称之为虚拟DOM


当数据发生变化时,能够智能地计算出重新渲染组件的最小代价并应用到DOM操作上。



// The Vue build version to load with the `import` command

// (runtime-only or standalone) has been set in webpack.base.conf with an alias.

import Vue from 'vue'

import App from './App'

 

Vue.config.productionTip = false

 

/* eslint-disable no-new */

new Vue({

  el: '#app',

  template: '<App/>',

  components: { App }

})

 

console.dir(document)


 

vue.js的核心特点—MVVM模式

MVVM概述:M:Model数据模型 , V:view 视图模板  , vm:view-Model:视图模型



vue的MVVM实例(双向数据绑定):当输入框输入数据的时候,相应的message也会改变


<template>

  <div id="app">

    <input type="text" v-model="message"/>

    {{ message }}

  </div>

</template>

 

<script>

  export default {

    name: 'app',

    data () {

      return {

        message: 'Welcome'

      }

    }

  }

</script>

 

<style>

</style>



vue是如何实现双向数据绑定的:当数据发生改变—自动更新视图。利用Object.definedProperty中的setter/getter代理数据,监控对数据的操作


<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

  <input type="text" id="username"><br />

  <span id="uName"></span>

<script>

  var obj = {

    pwd: '123'

  }

  Object.defineProperty(obj, 'username', {

    set: function (val) {

      document.getElementById('uName').innerText = val

      document.getElementById('uNmae').value = val

      console.log('set')

    },

    get: function () {

    }

  })

  document.getElementById('username').addEventListener('keyup' ,function () {

    obj.username = event.target.value

  })

</script>

</body>

</html>


vue.js的核心特点—声明式渲染

Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM,初始化根实例,vue自动将数据绑定在DOM模板上


声明式渲染与命令式渲染区别


声明式渲染:所谓声明式渲染只需要声明在哪里,做什么,而无需关心如何实现


命令式渲染:需要具体代码表达在哪里,做什么,如何实践


需求:求数组中每一项的倍数,放在另一个数组中实例


命令式渲染


<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<script>

  var arr = [1, 2, 3, 4, 5]

  var newArr = []

  for (var i = 0; i < arr.length; i++) {

    newArr.push(arr[i] * 2)

  }

  console.log(newArr)

</script>

</body>

</html>



声明式渲染


<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<script>

  var arr = [1, 2, 3, 4, 5]

  var newArr = arr.map(function (item) {

    return item * 2

  })

  console.log(newArr)

</script>

</body>

</html>


AVM跨端开发框架


AVM(APICloud-View-Model)是APICloud推出的一个跨端高性能 JavaScript框架,更趋近于原生的编程体验,它提供简洁的模型来分离应用的用户界面、业务逻辑和数据模型,适合高度定制化的项目。AVM(APICloud View Model)是APICloud基于标准H5子集设计的DSL中间语言编程框架,其可具备如下能力:

 

Virtual DOM:通过虚拟DOM,渲染到不同终端,充分尊重系统特性,为不同终端执行差异处理,实现高效渲染;

组件化:高可重用性、可组合性、可维护性的架构设计,隐藏了复杂的DOM结构和行为,让开发者专注于应用的功能和外观;

数据绑定:轻松将数据源绑定到应用用户界面,降低逻辑复杂性和开发难度;

状态管理和路由:有效分离用户界面和数据处理,实现项目的工程化管理;

类Vue语法和兼容React JSX,兼具Vue的轻巧和React的灵活性。

 

APICloud DSL最终可编译为标准JS,通过DeepEngine渲染到app端和Web端,或者编译为微信小程序代码,用于微信小程序平台发布。


点击立即使用AVM跨端开发框架

An efficient app outsourcing platform that guarantees timely delivery!

Submit Requirements