前端进阶 -MVVM与 Vue

本文介绍了MVVM模式,强调了其在分离视图与数据逻辑、提高可维护性方面的优势。详细解释了Vue框架如何通过响应式、模板引擎和渲染实现MVVM,并对比了jQuery与框架的开发区别。
摘要由CSDN通过智能技术生成

MVVM

如何理解 MVVM

MVVM(Model-View-ViewModel)是一种前端架构模式,旨在将用户界面(View)与应用程序逻辑(ViewModel)和数据模型(Model)分离,以提高代码的可维护性和复用性。在MVVM中,ViewModel负责将数据从Model传递到View,同时也负责处理用户交互,并将用户操作反馈到Model。这种模式可以使开发人员更专注于数据和业务逻辑,而无需直接处理DOM操作。

MVVM的核心思想是数据驱动视图。ViewModel在这一模式中起到了关键作用,它使得View和Model之间的通信不再直接,而是通过ViewModel来进行。ViewModel通过数据绑定机制实现自动更新视图,从而将数据和视图解耦,提高了应用程序的可维护性和扩展性。

如何实现 MVVM

MVVM的实现通常借助于前端框架,如Vue、Angular和React。这些框架提供了工具和机制,帮助开发人员构建符合MVVM模式的应用程序。

在MVVM中,一个典型的实现流程包括:

  1. 创建数据模型(Model):定义应用程序的数据结构和状态。

  2. 创建视图模板(View):定义应用程序的用户界面结构,这里通常使用HTML模板。

  3. 创建ViewModel:ViewModel是连接数据模型和视图的中间层。它包含数据绑定逻辑,负责处理用户输入和业务逻辑。ViewModel将数据从Model映射到View上,并监听View中的用户操作,更新Model。

// Vue示例
var vm = new Vue({
    el: '#app',
    data: {
        title: '',
        list: []
    },
    methods: {
        add: function () {
            this.list.push(this.title);
            this.title = '';
        }
    }
});
  1. 建立数据绑定:通过数据绑定机制,将ViewModel中的数据绑定到View中对应的位置,实现自动更新。
<!-- Vue示例中的模板部分 -->
<template>
  <div id='app'>
    <div>
      <input v-model='title'>
      <button v-on:click='add'>submit</button>
    </div>
    <ul>
      <li v-for='item in list'>{{item}}</li>
    </ul>
  </div>
</template>
  1. 处理用户输入:ViewModel负责处理用户的交互操作,例如点击按钮、输入文本等。这些操作会触发ViewModel中的逻辑,进而更新数据模型和视图。

  2. 数据模型更新:当数据模型发生变化时,ViewModel会监听到这些变化并及时更新视图,确保用户界面保持同步。

是否解读过 Vue 源码(学习能力,技术能力,学习惰性)

解读Vue源码需要较高的学习能力和技术能力,因为源码阅读涉及到深入理解前端框架的内部机制、设计模式和算法。源码解读也需要克服学习惰性,耐心深入地探索框架的实现细节,从而提升自己的技术水平。

题目

说一下使用 jQuery 和使用框架的区别

使用 jQuery 和使用前端框架的区别主要在于开发方式和思维模式的不同:

  • jQuery

    • 以操作DOM为主,通过选择器获取DOM元素并执行操作。
    • 直接操作DOM,可能导致代码难以维护和扩展。
    • 对于复杂的交互逻辑,可能需要手动管理数据和状态,容易出现bug。
    <div>
        <input type='text' name='' id='txt-title'>
        <button id='btn-submit'>submit</button>
    </div>
    <div>
        <ul id='ul-list'></ul>
    </div>
    
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
        var textTitle = $('#txt-title')
        var ulList = $('#ul-list')
        var btnSubmit = $('#btn-submit')
        btnSubmit.click(() => {
            var title = textTitle.val()
            var li = $('<li>' + title + '</li>')
            ulList.append(li)
            textTitle.val('')
        })
    </script>
    
  • 前端框架(如Vue、React、Angular):

    • 采用组件化开发,将UI和数据逻辑封装成可重用的组件。
    • 引入数据绑定机制,实现数据与视图的自动同步更新。
    • 提供了更丰富的工具和机制,优化性能、提高开发效率。
    • 通常有更好的状态管理,支持单向数据流或双向数据绑定。
<!-- Vue示例中的模板部分 -->
<template>
  <div id='app'>
    <div>
      <input v-model='title'>
      <button v-on:click='add'>submit</button>
    </div>
    <ul>
      <li v-for='item in list'>{{item}}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: '',
      list: []
    };
  },
  methods: {
    add() {
      this.list.push(this.title);
      this.title = '';
    }
  }
};
</script>

说一下对 MVVM 的理解

在这里插入图片描述

MVVM是一种前端架构模式,它分为三个组成部分:

  • Model:表示数据和业务逻辑。它包

括数据源、数据操作和与后端通信等。

  • View:表示用户界面。它是用户与应用程序交互的地方,负责展示数据。

  • ViewModel:连接Model和View的中间层。它包含数据绑定逻辑,负责将Model中的数据映射到View上,并监听View中的用户操作,更新Model。

MVVM的核心思想是数据驱动视图。ViewModel在这一模式中起到了关键作用,它使得View和Model之间的通信不再直接,而是通过ViewModel来进行。ViewModel通过数据绑定机制实现自动更新视图,从而将数据和视图解耦,提高了应用程序的可维护性和扩展性。

MVVM 框架的三要素

响应式(Reactivity)

在Vue中,响应式是通过Object.defineProperty来实现的。下面是一个简单的示例,演示如何通过Object.defineProperty实现一个简单的响应式对象:

// 定义一个数据对象
const data = {
  message: 'Hello, Vue!'
};

// 将数据对象变成响应式
Object.keys(data).forEach(key => {
  let value = data[key];

  Object.defineProperty(data, key, {
    get() {
      console.log('访问', key);
      return value;
    },
    set(newValue) {
      console.log('更新', key, '新值为', newValue);
      value = newValue;
    }
  });
});

// 访问和修改响应式属性
console.log(data.message); // 访问 message
data.message = 'Hi, Vue!'; // 更新 message 新值为 Hi, Vue!

模板引擎(Template Engine)

在Vue中,你可以使用模板引擎编写带有指令的HTML模板,这些指令会在渲染时被解析和处理。以下是一个简单的Vue模板示例:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!'
    };
  },
  methods: {
    changeMessage() {
      this.message = 'Hi, Vue!';
    }
  }
};
</script>

在这个示例中,模板中的{{ message }}会被解析为数据中的message属性的值,并且@click指令会绑定到changeMessage方法上。

渲染(Rendering)

Vue的渲染过程涉及将虚拟DOM渲染成实际的HTML元素。以下是一个简化的示例,演示了如何将虚拟DOM渲染成实际的HTML:

// 虚拟DOM
const vnode = {
  tag: 'div',
  children: [
    {
      tag: 'p',
      text: 'Hello, Render!'
    }
  ]
};

// 渲染函数
function render(vnode) {
  const el = document.createElement(vnode.tag);
  
  if (vnode.text) {
    el.appendChild(document.createTextNode(vnode.text));
  }

  if (vnode.children) {
    vnode.children.forEach(child => {
      el.appendChild(render(child));
    });
  }

  return el;
}

// 渲染虚拟DOM
const root = document.getElementById('app');
const realDOM = render(vnode);
root.appendChild(realDOM);

在这个示例中,虚拟DOM表示一个嵌套的HTML结构,渲染函数将虚拟DOM递归地转换为实际的HTML元素,并将其附加到根元素上。

总结

MVVM是一种优秀的前端架构模式,通过分离数据、视图和业务逻辑,提高了应用程序的可维护性和可扩展性。Vue作为一个典型的MVVM框架,通过响应式、模板引擎和渲染过程,实现了数据驱动视图的机制,简化了前端开发的复杂性,提升了开发效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子☆心酸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值