返回顶部
首页 > 资讯 > 精选 >怎么使用ES6的class写一个双向绑定
  • 213
分享到

怎么使用ES6的class写一个双向绑定

2023-06-17 09:06:02 213人浏览 薄情痞子
摘要

今天小编给大家分享一下怎么使用es6的class写一个双向绑定的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。最终效果如下:构

今天小编给大家分享一下怎么使用es6的class写一个双向绑定的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

最终效果如下:

怎么使用ES6的class写一个双向绑定

构造器(constructor)

构造一个TinyVue对象,包含基本的el,data,methods

class TinyVue{ constructor({el, data, methods}){  this.$data = data  this.$el = document.querySelector(el)  this.$methods = methods  // 初始化  this._compile()  this._updater()  this._watcher() }}

编译器(compile)

用于解析绑定到输入框和下拉框的v-model和元素的点击事件@click。

先创建一个函数用来载入事件:

// el为元素tagName,attr为元素属性(v-model,@click)_initEvents(el, attr, callBack) { this.$el.querySelectorAll(el).forEach(i => {  if(i.hasAttribute(attr)) {   let key = i.getAttribute(attr)   callBack(i, key)  } })}

载入输入框事件

this._initEvents('input, textarea', 'v-model', (i, key) => { i.addEventListener('input', () => {  Object.assign(this.$data, {[key]: i.value}) })})

载入选择框事件

this._initEvents('select', 'v-model', (i, key) => { i.addEventListener('change', () => Object.assign(this.$data, {[key]: i.options[i.options.selectedIndex].value}))})

载入点击事件

点击事件对应的是methods中的事件

this._initEvents('*', '@click', (i, key) => { i.addEventListener('click', () => this.$methods[key].bind(this.$data)())})

视图更新器(updater)

同理先创建公共函数来处理不同元素中的视图,包括input、textarea的value,select的选择值,div的innerhtml

_initView(el, attr, callBack) { this.$el.querySelectorAll(el, attr, callBack).forEach(i => {  if(i.hasAttribute(attr)) {   let key = i.getAttribute(attr),    data = this.$data[key]   callBack(i, key, data)  } })}

更新输入框视图

this._initView('input, textarea', 'v-model', (i, key, data) => { i.value = data})

更新选择框视图

this._initView('select', 'v-model', (i, key, data) => { i.querySelectorAll('option').forEach(v => {  if(v.value == data) v.setAttribute('selected', true)  else v.removeAttribute('selected') })})

更新innerHTML

这里实现方法有点low,仅想到正则替换{{text}}

let regExpInner = /\{{ *([\w_\-]+) *\}}/gthis.$el.querySelectorAll("*").forEach(i => { let replaceList = i.innerHTML.match(regExpInner) || (i.hasAttribute('vueID') && i.getAttribute('vueID').match(regExpInner)) if(replaceList) {  if(!i.hasAttribute('vueID')) {   i.setAttribute('vueID', i.innerHTML)  }  i.innerHTML = i.getAttribute('vueID')  replaceList.forEach(v => {   let key = v.slice(2, v.length - 2)   i.innerHTML = i.innerHTML.replace(v, this.$data[key])  }) }})

监听器(watcher)

数据变化之后更新视图

<div id="app"> <input type="text" v-model="text1"><br> <input type="text" v-model="text2"><br> <textarea type="text" v-model="text3"></textarea><br> <button @click="add">加一</button> <h2>您输入的是:{{text1}}+{{text2}}+{{text3}}</h2> <select v-model="select">  <option value="volvo">Volvo</option>  <option value="saab">Saab</option> </select> <select v-model="select">  <option value="volvo">Volvo</option>  <option value="saab">Saab</option> </select> <h2>您选择了:{{select}}</h2></div><script src="./Tinyvue.js"></script><script> let app = new TinyVue({  el: '#app',  data: {   text1: 123,   text2: 456,   text3: '文本框',   select: 'saab'  },  methods: {   add() {    this.text1 ++    this.text2 ++   }  } })</script>

TinyVue全部代码

class TinyVue{ constructor({el, data, methods}){  this.$data = data  this.$el = document.querySelector(el)  this.$methods = methods  this._compile()  this._updater()  this._watcher() } _watcher(data = this.$data) {  let that = this  Object.keys(data).forEach(i => {   let value = data[i]   Object.defineProperty(data, i, {    enumerable: true,    configurable: true,    get: function () {     return value;    },    set: function (newVal) {     if (value !== newVal) {      value = newVal;      that._updater()     }    }   })  }) } _initEvents(el, attr, callBack) {  this.$el.querySelectorAll(el).forEach(i => {   if(i.hasAttribute(attr)) {    let key = i.getAttribute(attr)    callBack(i, key)   }  }) } _initView(el, attr, callBack) {  this.$el.querySelectorAll(el, attr, callBack).forEach(i => {   if(i.hasAttribute(attr)) {    let key = i.getAttribute(attr),     data = this.$data[key]    callBack(i, key, data)   }  }) } _updater() {  this._initView('input, textarea', 'v-model', (i, key, data) => {   i.value = data  })  this._initView('select', 'v-model', (i, key, data) => {   i.querySelectorAll('option').forEach(v => {    if(v.value == data) v.setAttribute('selected', true)    else v.removeAttribute('selected')   })  })  let regExpInner = /\{{ *([\w_\-]+) *\}}/g  this.$el.querySelectorAll("*").forEach(i => {   let replaceList = i.innerHTML.match(regExpInner) || (i.hasAttribute('vueID') && i.getAttribute('vueID').match(regExpInner))   if(replaceList) {    if(!i.hasAttribute('vueID')) {     i.setAttribute('vueID', i.innerHTML)    }    i.innerHTML = i.getAttribute('vueID')    replaceList.forEach(v => {     let key = v.slice(2, v.length - 2)     i.innerHTML = i.innerHTML.replace(v, this.$data[key])    })   }  }) } _compile() {  this._initEvents('*', '@click', (i, key) => {   i.addEventListener('click', () => this.$methods[key].bind(this.$data)())  })  this._initEvents('input, textarea', 'v-model', (i, key) => {   i.addEventListener('input', () => {    Object.assign(this.$data, {[key]: i.value})   })  })  this._initEvents('select', 'v-model', (i, key) => {   i.addEventListener('change', () => Object.assign(this.$data, {[key]: i.options[i.options.selectedIndex].value}))  }) }}

以上就是“怎么使用ES6的class写一个双向绑定”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: 怎么使用ES6的class写一个双向绑定

本文链接: https://lsjlt.com/news/288142.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么使用ES6的class写一个双向绑定
    今天小编给大家分享一下怎么使用ES6的class写一个双向绑定的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。最终效果如下:构...
    99+
    2023-06-17
  • 怎么使用ES6的class实现一个双向绑定
    这篇文章主要介绍“怎么使用ES6的class实现一个双向绑定”,在日常操作中,相信很多人在怎么使用ES6的class实现一个双向绑定问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用ES6的class实现...
    99+
    2023-07-04
  • 如何使用ES6的class模仿Vue写一个双向绑定
    小编给大家分享一下如何使用ES6的class模仿Vue写一个双向绑定,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:最终...
    99+
    2024-04-02
  • vue怎么使用defineProperty实现数据的双向绑定
    这篇文章主要讲解了“vue怎么使用defineProperty实现数据的双向绑定”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue怎么使用defineProperty实现数据的双向绑定”吧...
    99+
    2023-07-04
  • 使用Vue.js实现数据的双向绑定
    目录如何用Vue.js实现数据的双向绑定?1. 理解双向绑定2. 使用v-model指令3. 使用自定义组件实现双向绑定4. 数据劫持5. 模板引擎6.Object.definePr...
    99+
    2023-05-16
    Vue.js数据的双向绑定 Vue.js双向绑定
  • ES6的Class类怎么使用
    本篇内容介绍了“ES6的Class类怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在ES6中,class (类)作为对象的模板被引入...
    99+
    2023-06-27
  • proxy怎么实现数据的双向绑定
    本篇内容介绍了“proxy怎么实现数据的双向绑定”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写在前面随着 vue3.x 的消息越来越多,p...
    99+
    2023-06-03
  • ES6中的class类怎么使用
    本篇内容主要讲解“ES6中的class类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ES6中的class类怎么使用”吧! 认识class定义类 我...
    99+
    2024-04-02
  • Vue2.0中怎么实现数据的双向绑定
    这篇文章给大家介绍Vue2.0中怎么实现数据的双向绑定,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现组件双向数据绑定在上一节中最后的示例使用的是Vue 1.0版本中的 .sync ...
    99+
    2024-04-02
  • Vue组件间的双向绑定怎么实现
    这篇“Vue组件间的双向绑定怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue组件间的双向绑定怎么实现”文章吧。何...
    99+
    2023-07-05
  • vue双向绑定的订阅器怎么实现
    这篇文章主要介绍“vue双向绑定的订阅器怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue双向绑定的订阅器怎么实现”文章能帮助大家解决问题。在Vue.js中,双向数据绑定是其最为重要也是最...
    99+
    2023-07-06
  • 详解用Vue怎么实现数据的双向绑定
    在Vue.js中,双向数据绑定是一项非常强大的功能,它能够使数据和视图之间保持同步,让开发者更加方便地操作数据。在本文中,我们将介绍如何用Vue.js实现数据的双向绑定。1. 理解双向绑定首先,我们需要了解双向绑定的原理。在Vue.js中...
    99+
    2023-05-14
    Vue.js
  • vue.js如何使用defineProperty实现数据的双向绑定
    这篇文章主要介绍了vue.js如何使用defineProperty实现数据的双向绑定,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue.j...
    99+
    2024-04-02
  • 基于Vue支持数据双向绑定的select组件怎么用
    这篇文章主要为大家展示了“基于Vue支持数据双向绑定的select组件怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“基于Vue支持数据双向绑定的...
    99+
    2024-04-02
  • 怎么使用域名来绑定一个虚拟机
    域名与虚拟机进行绑定的方法:1.进入域名代理商网站,登录域名管理控制台;2.点击左侧菜单栏“域名管理”选项;3.选择需要绑定虚拟机的域名,点击“管理”;4.选择“域名解析”,点击“添加解析”按钮;5.添加一个记录类型为“a记录”,主机记录为...
    99+
    2024-04-02
  • AngularJS双向数据绑定原理之$watch、$apply和$digest怎么用
    小编给大家分享一下AngularJS双向数据绑定原理之$watch、$apply和$digest怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!背景AngularJS开发者都想知道双向...
    99+
    2024-04-02
  • vue单向以及双向数据绑定方式(v-bind和v-model的使用)
    目录准备工作v-bind单向绑定v-model双向绑定总结准备工作 首先还是创建一个新的页面写入基本代码 v-bind单向绑定 <!DOCTYPE html> <h...
    99+
    2023-05-17
    vue单向数据绑定 vue双向数据绑定 vue v-bind使用 vue v-model使用
  • JS怎么使用function实现一个class
    本文小编为大家详细介绍“JS怎么使用function实现一个class”,内容详细,步骤清晰,细节处理妥当,希望这篇“JS怎么使用function实现一个class”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。正...
    99+
    2023-07-04
  • 使用Nodejs怎么编写一个定时爬虫
    使用Nodejs怎么编写一个定时爬虫?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。const axios = require('axi...
    99+
    2023-06-09
  • wpf怎么绑定一个对象的多个属性
    在WPF中,可以使用绑定表达式来绑定一个对象的多个属性。首先,需要创建一个实现了INotifyPropertyChanged接口的类...
    99+
    2023-09-06
    wpf
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作