首页 > 其他分享 >mvvm

mvvm

时间:2024-04-06 10:11:37浏览次数:10  
标签:console log mvvm item key vmKey data

class Vue {
    constructor(options) {
        /* 视图的驱动 */
        this.$el = options.el
        this._data = options.data
        this.$options = options
        this.$watchEvent = {}
        console.log(document.querySelector(this.$el),this._data,this.$options);
        const node = document.querySelector(this.$el)
        this.observe();
        this.proxyData();
        this.compile(node)
    }
    /* 渲染视图 */
    observe() {
        for (let key in this._data) {
            let value = this._data[key]
            let that = this;
            Object.defineProperty(this._data, key, {
                get() {
                    return value
                },
                set(val) {
                    value = val;
                    if (that.$watchEvent[key]) {
                        that.$watchEvent[key].forEach(item => {
                            item.update();
                        })
                    }
                }
            })
        }
    }
    /* 数据劫持的原理就是对data当中的每一个属性都使用Object.defineProperty绑定get/set方法 */
    proxyData() {
        for (let key in this._data) {
            Object.defineProperty(this, key, {
                get() {
                    return this._data[key]
                },
                set(val) {
                    return this._data[key] = val
                }
            })
        }
    }
    /* 模板解析: 
            将data数据渲染到模板当中
    */
    compile(node) {
        node.childNodes.forEach((item, index) => {
            if (item.nodeType === 1) {
                if (item.hasAttribute("@click")) {
                    let vmKey = item.getAttribute("@click").trim();
                    item.addEventListener("click", (e) => {
                        this.$options.methods[vmKey].bind(this)(e) 
                        console.log(this);
                    })
                }
                if (item.hasAttribute("v-model")) {
                    console.log(111+item.getAttribute("v-model"));
                    let vmKey = item.getAttribute("v-model").trim();
                    if (this.hasOwnProperty(vmKey)) {
                        // console.log(item,this[vmKey]);
                        item.value = this[vmKey]
                    }
                    item.addEventListener('input', (event) => {
                        this[vmKey] = item.value
                    })
                }
                if (item.childNodes.length > 0) {
                    this.compile(item)
                }
            }
            // console.log(item, item.nodeType);
            if (item.nodeType === 3) {
                // console.log(item, item.textContent);
                const reg = /\{\{(.*?)\}\}/g
                let text = item.textContent;
                console.log(text+222);
                item.textContent = text.replace(reg, (match, vmKey) => {
                    vmKey = vmKey.trim();
                    console.log(vmKey+111);
                    /* 渲染视图 */
                    // console.log(this, vmKey, item, 'textContent');
                    if (this.hasOwnProperty(vmKey)) {
                        let watch = new Watch(this, vmKey, item, 'textContent')
                        if (this.$watchEvent[vmKey]) {
                            this.$watchEvent[vmKey].push(watch)
                        } else {
                            this.$watchEvent[vmKey] = []
                            this.$watchEvent[vmKey].push(watch)
                        }
                    }
                    return this._data[vmKey]
                })
            }
        });
    }
}

class Watch {
    constructor(vm, key, node, attr) {
        this.vm = vm;
        this.node = node;
        this.key = key;
        this.attr = attr;
    }
    //执行改变
    update() {
        this.node[this.attr] = this.vm[this.key]
    }
}

 

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

<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">
    <title>Document</title>
</head>

<body>
    <div id="app">
        {{msg}}
        <p>{{ msg }}</p>
        <h1>{{msg}}</h1>
        <h4>{{msg}}</h4>
        <h2>msg</h2>
        <button @click="btn">点我试试</button>
        <p @click="pppp">pppbiaoqian </p>
        <input type="text" v-model="msg">
    </div>
    <script src="./vue.js"></script>
    <script>
        const vm = new Vue({
            el: "#app",
            data: {
                msg: "Hello World",
                message: "abcd"
            },
            methods: {
                btn(e) {
                    this.msg = "世上只有妈妈好!"
                    console.log(e, 333333);
                },
                pppp() {
                    console.log("abcddddd");
                }
            }
        })
        console.log(vm);
    </script>
</body>

</html>

  

标签:console,log,mvvm,item,key,vmKey,data
From: https://www.cnblogs.com/ma-ke-wang/p/18117192

相关文章

  • C#中的MVVM
    MVVM(Model-View-ViewModel)是一种设计模式,通常与WPF(WindowsPresentationFoundation)和Xamarin等框架结合使用,用于构建基于XAML的应用程序。MVVM是MVC模式的衍生,旨在进一步分离应用程序的逻辑和界面。以下是MVVM的知识点以及可能会在面试中被问到的一些问题和答案:MVVM的......
  • [C#] [WPF] MVVMToolkit入门案例心得
    跟着做的第一个MVVM项目,学到一点基础的东西,记下来;有些用词不准确假设我们要做一个页面,通过按钮来控制上方文本框的文字,通过勾选框来控制按钮的激活状态⬇️一般流程需要3个属性,2个私有属性,1个RelayCommand属性代表按钮点击后事件,并配有相应的getter/setter文本......
  • MVVM中ICommand的具体使用
    本节使用MVVM模式进行演示MyCommand为自定义的命令类,代码如下:publicclassMyComand:ICommand{privatereadonlyAction<object>_action;privatereadonlyFunc<object,bool>?_func;publicMyComand(Action<object>action,Func<object,bool>......
  • vue一些基础概念,核心理念,框架和库的区别,MVC和MVVM的区别,展示数据的几种方法、v-bind、
    1、什么是vue,核心理念,为什么学习vue1(单页面应用程序)用于构建用户界面的渐进式框架,采用自底向上增量开发的设计2数据驱动视图,组件化开发3轻量级框架、简单易学、虚拟的DOM、数据视图结构分离下面展示一些内联代码片。下面是vue的代码框架分为三部分:1.引入vue.js;2......
  • WPF MVVM模式ListBox下ContextMenu绑定Command的方法以及将所选的Item的数据传回去
    需求:ListBoxItem上右键,将数据传参。疑问:ContextMenu不继承DataContext,导致直接用RelativeSource找根的方式也绑定不到。解决方法:在ListBox.ContextMenu里写菜单,就可以直接绑定到ViewModel层的命令了,参数先用RelativeSource找到ContextMenu,再绑定PlacementTarget.SelectedItem。......
  • Vue的MVVM模式与双向绑定原理
    v-model 是Vue.js框架中用于实现双向数据绑定的指令。它充分体现了MVVM(Model-View-ViewModel)模式中的双向数据绑定特性。下面我们将详细解释 v-model 如何体现MVVM和双向绑定:1.MVVM模式MVVM模式是一种软件架构设计模式,它将应用程序分为三个部分:Model(模型):代表应用程......
  • MvvmLight中,两个依赖属性的值发生变化时影响第三个控件属性的用法
    使用数据绑定配合IValueConverter(值转换器)创建一个自定义转换器,该转换器接收两个输入值,并根据他们是否相等返回相应的输出值。然后将这个转换器应用到第三个控件的属性上1publicclassEqualityToTextConverter:IValueConverter2{3publicobjectConvert(o......
  • 【WPF】MVVM极其简单的例子
    目的:通过例子了解、理解MVVM的基本结构。ModelnamespaceWpfStudy.Model{publicclassUserModel{publicstringName{get;set;}}}ViewModelnamespaceWpfStudy.ViewModel{publicclassMainVM:NotifyPropBase{publicM......
  • 一文搞懂Vue的MVVM模式与双向绑定
    v-model是Vue.js框架中用于实现双向数据绑定的指令。它充分体现了MVVM(Model-View-ViewModel)模式中的双向数据绑定特性。下面我们将详细解释v-model如何体现MVVM和双向绑定:1.MVVM模式MVVM模式是一种软件架构设计模式,它将应用程序分为三个部分:Model(模型):代表应用程序的......
  • mvvmtoolkit+snackbar弹窗消息通知
    需求场景:在MainView.xaml下添加一个SnackBar并将其ZIndex设置成1,后续所有的消息弹窗都通过MainView来展示代码设置:MVVMToolkit+MaterDesigner组+全局静态类MainView下添加SnackBar,SnackBar下的消息数据以及是否展示属性绑定至一个全局消息类中,后续所有的消息展示则可以通过......