问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

我想建立一个自己的库该怎么做呢?

发布网友 发布时间:2022-04-22 23:57

我来回答

2个回答

懂视网 时间:2022-04-23 04:19

这次给大家带来如何开发一个自定义库,开发一个自定义库的注意事项有哪些,下面就是实战案例,一起来看一下。

当然这个库还处在刚刚开始阶段,功能实现的比较简单,在此发表出来,欢迎大家借此为基础一起去完善它。项目地址:Hoz.js,欢迎大家start,fork,以及提issues。

特点

  • 声明式的模板语法

  • 借鉴redux,flux等的思想,引入状态管理

  • 引入virtual dom,diff 算法,提高性能

  • 声明式语法

     <p id = "app">
     <p>
      <img src="{{moveImage}}" />
      <p>{{moveName}}</p>
     </p>
     </p>
    var hoz = new Hoz('app', state, changeStore)
    var state = {
     moveName: '',
     moveImage: ''
    }
    function changeStore (state, action) {
     switch (action.type) {
     case 'SET_NAME': {
     state.moveName = action.data
     break
     }
     case 'SET_IMAGE': {
     state.moveImage = action.data
     break
     }
     }
    }
    hoz.store.dispatch({
     type: 'SET_NAME',
     data: '后来的我们'
    })

    这就是一个hoz应用,通过简洁的模板语法声明式的将数据渲染进DOM系统。
    且所有东西都是响应式的。

    借鉴redux,flux等的思想,引入状态管理

    在状态管理方面借鉴redux的思想,实现了单向数据流的管理。
    主要定义了state,action,changeStore,dispatch4个概念。

    state

    存放数据

    var state = {
     moveName: '',
     moveImage: ''
    }

    changeStore

    相当于redux中的reducer,存放着对数据的所有操作

    function changeStore (state, action) {
     switch (action.type) {
     case 'SET_NAME': {
     state.moveName = action.data
     break
     }
     case 'SET_IMAGE': {
     state.moveImage = action.data
     break
     }
     }
    }

    接收action,执行对应的方法,修改state中的数据。不同于redux的是,redux放回的是全新的state,而它是直接操作当前的state,因为state中的数据已经通过Object.defineProperty方法进行了跟踪,这个后面再将。

    action和dispatch

    当想要对数据进行修改的时候,我们必须通过提交action的方式,在changeStore中去修改state

    hoz.store.dispatch({
     type: 'SET_NAME',
     data: '后来的我们'
    })

    这个就是hoz的状态管理策略

     view -> dispatch -> action -> changeStore -> state -> view

    好处

    随着应用的日益复杂,数据量的增大,如果不对数据进行相应的管理,管理不断变化的状态,是非常困难的。状态在什么时候,由于什么原因,发生了怎样的变化都难以观察。

    1. 这意味着应用中所有的数据都遵循相同的生命周期,这样可以让应用变得更加可预测且容易理解。

    2. 我们可以从 changeStore 中看到state能够发生的所有变化

    3. 对state修改的唯一方式就是向changeStore提交action,所以数据的每一次变化都会从一个地方流过,方便我们的debug等操作。

    引入virtual dom 和diff算法

    总所周知,由于dom元素的庞大,以及dom操作容易引起页面重排的原因,直接操作dom性能是非常非常差的。
    所以hoz引入了virtual dom算法,用原生的JavaScript对象去映射dom对象,因为原生JavaScript对象的操作更快更简单。
    如何映射呢?比如

    class VNode {
     constructor (sel, tagName, id, className, el, children, data, text, key) {
     this.tagName = tagName // p
     this.sel = sel // p#id.class
     this.id = id // id
     this.className = className // []
     this.children = children // []
     this.el = el // node
     this.data = data // {}
     this.key = key
     this.text = text
     }
    }
    export default VNode

    只是一个JavaScript对象,代表一个dom元素。

    我根据hoz构造函数中传进来的 id 所指向的元素作为根元素建立一个虚拟dom树,当数据改变的时候,不直接操作dom,而是在虚拟dom树上进行操作修改。然后通过diff算法对比新旧虚拟dom树,对真实dom进行最小单位的修改。

    数据响应式原理

    hoz式如何做到数据的响应式的呢?这里主要通过借助Object.defineProperty方法实现了一个发布/订阅模式,通过Object.defineProperty修改state中数据的getter和setter属性,在首次渲染的时候,在getter中将对应的订阅者添加到一个主题对象中去,当数据改变的时候在setter中调用对应数据的主题对象的notify方法发布消息,通知每个订阅者更新。

    state -> data -> publisher 一对多的关系
       |
       Dep
       |
    view -> {{data}} -> subscribers

    希望大家借此为基础一起去完善它。项目地址:Hoz.js,欢迎大家start,fork,以及提issues。

    相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

    推荐阅读:

    前端,HTT,计算机与网络

    webkit-font-smoothing字体抗锯齿渲染使用案例详解

    热心网友 时间:2022-04-23 01:27

    比如: cn.lzj
    1.先建立一个文件:名字是 cn
    2.在CN中在建立一个文件:名字是 lzj

    可以在cn 或lzj 文件里建立类了,不过记住
    在 cn文件下的类 必须以 package cn;开头
    在 lzj文件下的类 必须以 package cn.lzj; 开头
    晕!! 从最基本的开始给你讲把!!!!!!
    1.装完JDK后 一定要先 设置path ,这个我就不多说了,随便拿本JAVA基础书 第一章就是这个东西!
    2.设置classpath 在我的电脑右键 属性 高级 环境变量 新建 名字:classpath 值:比如cn文件所在的根路径 d:\test 中,这时 classpath的值就是d:\test;
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    福如东海终身寿险(A款)(分红型)能退多少钱 我买的新华人寿保险福如东海A型,但是想退了。 杭州樱花日语学校的学习效果如何得到管理与跟踪? 枣子不能与什么一起吃 枣子和什么食物相克 枣子和什么相克 枣子跟什么不能一起吃 电风扇带不动风叶拿掉风叶能转是怎么回事 嵌入式学习首先要学什么基础 学习嵌入式的基础是什么 oppor9splus和oppor9s的区别 白酒酿造过程中,在蒸馏过后陈年,然后勾兑调和?有没有只蒸馏后就出 这个陈年老酒茅台酿酒厂出产的1966年生产的值多少钱? 为什么说酒是陈年的香 武侠小说里面,陈年酿酒,封住酒坛子上面的泥土一样的东西叫什么? 湖北男子从地里挖出10年美酒过年,自己酿酒要注意什么? 陈年的葡萄酒好处是什么? 适合20岁长痘混合偏油皮肤女生用的护肤品(别在别的地方复制过来,要亲身使用过的) 对于面上痘印和凹下去的地方的解决方法 酿酒为什么用陈年米 脸上长痘留下的小洞用什么护肤品管用 神秘博士面膜适合多少岁 肤博士靓颜套装适合多大的人用,20岁可以吗? 微信公众号邀请赞赏账户不是自己的怎么办 张信哲音最高的歌曲 张信哲经典歌词有哪些?大神们帮帮忙 你和他之间已经有了真感情李宗盛的叫什么歌 谁知道张信哲的这首歌的名字“你和他之间是否已经动了真感情,别隐瞒,别怕我伤心。” “你和他之间 是否也有真感情....” 是哪首歌的歌词?拜托了各位 谢谢 你和他之间,是否已经动了真感情。是哪首歌的歌词? oppor9s外屏跟oppor9splus一样吗? 中国银行申请信用卡显示状态 三亲见,一个星期了这是代表没通过还是通 鲨鱼不吃向导鱼是真的吗? 请问鲨鱼害怕什么鱼? 鲨鱼最不喜欢吃什么 为什么鲨鱼不吃向导鱼? 怎样创建自己的头文件和库 高能无记忆锂离子电池多少钱一个啊? 关于 高能无记忆锂离子电池 3.6v 1800mah 高能无记忆锂离子电池3,6v3800mah海洋王充不进电了电池存不进电 12.6v高能无记忆充电锂电池组 那有的买 3.7v2000mah的高能无记忆锂离子电池的配套充电器 贵州省教师公招考试考些什么科目? 联考省份都有哪一些? 联考省份 326联考有哪些省 联考的省份都有哪些 小孩子身上有静电是怎么回事 怎样去除身上的静电呢 怎样建立自己的函数库