Vue的设计理念

2021-9-29    前端达人

目录

Mvvm模型

Vue中的Mvvm实现原理

自己实现双向数据绑定的示例

Vue与模板引Thymeleaf擎对比

显示变量值(Vue)

 显示变量值(Thymeleaf)

替换Html(Vue)

替换Html(Thymeleaf)

绑定属性(Vue)

绑定属性(Thymeleaf)

隐藏显示区块(Vue)

隐藏显示区块(Thymeleaf)

遍历列表数据-带索引(Vue)

 遍历列表数据-带索引(Thymeleaf)

引入其他文件内容(vue)

引入其他文件内容(Thymeleaf)

Vue的页面定义基石-Options API

Vue中的代理运用

nginx反向代理

vue代理(正向代理)

Vue特性能力-filter


Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合

Mvvm模型

MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自动传递给 View,即所谓的数据双向绑定。
Vue.js 是一个提供了 MVVM 风格的双向数据绑定的 Javascript 库,专注于View 层。它的核心是 MVVM 中的 VM,也就是 ViewModel。 ViewModel负责连接 View 和 Model,保证视图和数据的一致性,这种轻量级的架构让前端开发更加高效、便捷。

Vue中的Mvvm实现原理

Vue.js的实现方式,对数据(Model)进行劫持,当数据变动时,数据会出发劫持时绑定的方法,对视图进行更新。

这里有两个方向: 

1、数据流向视图:数据变动时,能自动更新Dom节点的内容。此功能是通过数据劫持实现的,对数据(Model)进行劫持,当数据变动时,会调用劫持时绑定的方法,对视图进行更新。

2、视图流向数据:如输入框input内容发生变动时,input对应的数据也会发生变动。此功能是通过监听Dom事件实现的。当用户在输入框中输入文字(即inputkeyup事件发生时),vue会监听到这个事件,找到对应的数据模型变量,修改变量值。

vue中双向数据绑定的示例


  1. <div id="app-6">
  2. <p>{{ message }}</p>
  3. <input v-model="message">
  4. </div>

  1. var app6 = new Vue({
  2. el: '#app-6',
  3. data: {
  4. message: 'Hello Vue!'
  5. }
  6. })

自己实现双向数据绑定的示例


  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>双向绑定demoo</title>
  5. <meta charset="UTF-8">
  6. </head>
  7. <body>
  8. <div id="app">
  9. <input type="text" id="txt">
  10. <p id="show-txt"></p>
  11. </div>
  12. </body>
  13. <script>
  14. var model={}
  15. Object.defineProperty(model,'txt',{
  16. _txt: "",
  17. get:function(){
  18. return _txt
  19. },
  20. set:function(newValue){
  21. _txt = newValue
  22. document.getElementById('txt').value = newValue
  23. document.getElementById('show-txt').innerHTML = newValue
  24. }
  25. })
  26. document.addEventListener('keyup',function(e){
  27. model.txt = e.target.value
  28. })
  29. </script>
  30. </html>

这里要讲到一个关键函数

Object.defineProperty 

Object.defineProperty 需要三个参数(object , propName , descriptor)

1 object 对象 => 给谁加
2 propName 属性名 => 要加的属性的名字 【类型:String】
3 descriptor 属性描述 => 加的这个属性有什么样的特性【类型:Object】

descriptor 属性描述

get一个给属性提供getter的方法,如果没有getter则为undefined。该方法返回值被用作属性值。默认为undefined
set一个给属性提供setter的方法,如果没有setter则为undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认值为undefined

Vue与模板引Thymeleaf擎对比

显示变量值(Vue)


  1. <div id="app">
  2. {{ message }}
  3. </div>

 显示变量值(Thymeleaf)


  1. <div id="app" th:text="${message}">
  2. </div>

替换Html(Vue)


  1. <div id="app" v-html="content">
  2. </div>

替换Html(Thymeleaf)


  1. <div id="app" th:html="${content}">
  2. </div>

绑定属性(Vue)

<img :src="imgUrl" :id="newId"/>

绑定属性(Thymeleaf)

<img th:attr="id=${newId},src=${imgUrl}"/>

隐藏显示区块(Vue)


  1. <div id="app" v-if="show">
  2. 这是一个区块
  3. </div>

隐藏显示区块(Thymeleaf)


  1. <div id="app" th:if="${show}">
  2. 这是一个区块
  3. </div>

遍历列表数据-带索引(Vue)


  1. <ul id="app">
  2. <li v-for="(item, index) in dataList">
  3. {{ index }} - {{ item.message }}
  4. </li>
  5. </ul>

 遍历列表数据-带索引(Thymeleaf)


  1. <ul id="app">
  2. <li th:each="item, stat: ${dataList}">
  3. {{ stat.index }} - {{ item.message }}
  4. </li>
  5. </ul>

引入其他文件内容(vue)

在vue中,可复用的单元块被称为组件,定义组件


  1. <template>
  2. <button v-on:click="count++">You clicked me {{ count }} times.</button>
  3. </template>
  4. <script>
  5. export default {
  6. name: "button-counter"
  7. data(){
  8. count: 0
  9. }
  10. }
  11. </script>

 引入组件


  1. <div id="components-demo">
  2. <button-counter></button-counter>
  3. </div>

引入其他文件内容(Thymeleaf)

被导入模块index.html:


  1. <div th:fragment="head">
  2. 这是网页头
  3. </div>

在其它页面导入index.html中的head模块:

<div th:include="index::head"></div>

由此可见在Html层面上来讲,vue和后台的模板引擎,整个设计方向是一样。都是使用特定属性标签,来描述如何把数据映射到视图上。

Vue的页面定义基石-Options API

Options API,即大家常说的选项API,即以vue为后缀的文件,通过定义methodscomputedwatchdata等属性与方法,共同处理页面逻辑

可以看到Options代码编写方式,如果是组件状态,则写在data属性上,如果是方法,则写在methods属性上...

这种形式的页面定义类似一个配置文件,定义了页面的数据模型和行为

Vue中的代理运用

代理服务器:所谓代理服务器就是位于发起请求的客户端与原始服务器端之间的一台跳板服务器,是以正向代理可以隐藏客户端,反向代理可以隐藏原始服务器。

代理分为正向代理和反向代理,下面就以我们实际使用中的示例讲解下这两种代理方式的区别。

nginx反向代理

这样对于浏览器而言,浏览器只需要访问代理服务器,就可以达到同时访问两个网站的目的

 

我们看下实际场景下的nginx的配置 


  1. server {
  2. listen 4503;
  3. server_name vue.izkml.com;
  4. access_log "pipe:rollback logs/gov-manage-new-vue/access_log interval=1d baknum=7 maxsize=2G" main;
  5. # 接口代理
  6. location /api {
  7. #去除 /api前缀
  8. rewrite ^.+api/?(.*)$ /$1 break;
  9. # 转发到 117.71.53.199:50020端口上
  10. proxy_pass http://117.71.53.199:50020;
  11. proxy_buffering off;
  12. }
  13. # 页面文件代理
  14. location / {
  15. # 直接去本地文件读取文件路径
  16. root html/gov-task-supervison;
  17. index index.html index.htm;
  18. if (!-e $request_filename) {
  19. rewrite ^/(.*) /index.html last;
  20. break;
  21. }
  22. }
  23. }

其中可以看到,主要分为接口代理和页面代理两部分
1. 如果是/api前缀的请求,则去除/api前缀,转发到后台网关端口上
2. 其他情况下,请求的为页面内容,在html/gov-task-supervison文件夹中读取文件内容

vue代理(正向代理)

 


  1. devServer: { // 支持webPack-dev-server的所有选项
  2. port: 8888, // 端口号
  3. host: '0.0.0.0',
  4. https: false,
  5. open: true, //配置自动启动浏览器
  6. proxy: {
  7. '/api': {
  8. // 转发地址
  9. target: 'http://117.71.53.199:50020', //测试环境
  10. changeOrigin: true,
  11. ws: true,
  12. // 去除/api前缀
  13. pathRewrite: {
  14. '^/api': ''
  15. }
  16. }
  17. }
  18. }

这里主要看的是proxy字段,其中定义了规则

1. 如果是/api前缀的请求,则去除/api前缀,转发到后台网关端口上
2. 其他情况下,请求的为页面内容,直接读取本地项目路径下面的页面内容 **(隐式包含)**

Vue特性能力-filter

Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化

应用场景: 前端常量翻译


  1. <el-tag v-if="scope.row.status" class="round" size="small" >
  2. {{scope.row.status | CodeMaster('TASK_STATUS')}}
  3. </el-tag>

  1. Vue.filter('CodeMaster', function (value, type) {
  2. return Vue.prototype.$codeMaster.getCodeValue(type, value);
  3. })

在上面的代码中,我们在模板html中,添加了filter的调用,并传入了一个参数。
在vue进行html生成的过程中,会调用相应的filter,根据自定义的规则,完成文本格式化操作。




蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

分享此文一切功德,皆悉回向给文章原作者及众读者.

转自:csdn
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

分享本文至:

日历

链接

blogger

蓝蓝 http://www.lanlanwork.com

存档