IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 自己实现一个vue插件第一步 -> 正文阅读

[JavaScript知识库]自己实现一个vue插件第一步

通过rollup打包vue.js插件,上一篇文章讲解了怎么通过rollup打包一个js库

rollup打包项目_qq_27449993的博客-CSDN博客

vue是mvvm结构,

  • M (model):模型对象:指的是构成界面内容的相关数据
  • V(view): view: 视图对象:指的是给用户或者开发者展示数据的界面
  • VM(viewmodel): 视图模型对象:是view与model之间的桥梁

Vue.js的核心ViewModel

ViewModel是Vue.js的核心,它是一个Vue实例。Vue实例是作用于某一个HTML元素上的,这个元素可以是HTML的body元素,也可以是指定了id的某个元素。


<!DOCTYPE html>
<html lang="">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport"
    content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
  <title>
  vue-rollup打包项目第一步
  </title>
</head>

<body>
   <div id="app">
     Vue
   </div>
    <script language="JavaScript" type="text/javascript"  src="../dist/vue.js" ></script>
    <script>
      let vm=new Vue({
        el:'#app',
        data:{}
      })
    </script>
</body>

</html>

初始化vue?

初始化init,采用文件模块化实现,针对initMixin的混入

打包后

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Vue = factory());
})(this, (function () { 'use strict';
  function initMixin(Vue) {
    Vue.prototype._init = function (option) {
      this.$option = option;
    };
  }
  function Vue(option) {
    this._init(option);
  }
  console.log(initMixin);
  initMixin(Vue);
  return Vue;

}));

根据data,进行监听

首先判断data是否是一个函数,是的话,执行函数,再根据data判断是否是对象,data必须是一个对象,否则return

再根据data,进行监听

先写一个简易版的监听,只监听了data的第一层

utils/index.js


export const isFunction = function(obj) {      
  return Object.prototype.toString.call(obj) === '[object Function]' 
 }
 export const isObject=function(obj){
   return Object.prototype.toString.call(obj) == '[object Object]' 
 }

observe/index


import {isObject} from '../utils/index'
export default function observe(data){
if(!isObject(data)){
return
}
return new Observe(data)
}
function Observe(data){
Object.keys(data).forEach(key=>{
  console.log(data,key,data[key])
  defineReactive(data,key,data[key])
})
}
function defineReactive(data,key,value){
  let newValue=undefined
  Object.defineProperty(data,key,{
    enumerable: true,
    configurable: true,
    get(){
      return newValue||value
    },
    set(value){
      observe(value)
      newValue=value
      return value
    }
  })
}

将其写成一个class

import {isObject} from '../utils/index'
 class Observe{
  constructor(data){
    this.walk(data)
  }
  walk(data){
    Object.keys(data).forEach(key=>{
      defineReactive(data,key,data[key])
    })
  }
}
function defineReactive(data,key,value){
  Object.defineProperty(data,key,{
    get (){
      return value
    },
    set(newVlaue){
      observe(newVlaue)
      value= newVlaue
    }
  })
}
export default function observe(data){
  if(!isObject(data)){
  return
  }
  new Observe(data)
}

即初版针对data的监听就好了

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 18:03:56  更:2022-05-24 18:05:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:44:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码