• Vue基础-双向绑定:从 html 到 模板 到 渲染函数


    Vue 测试版本:Vue.js v2.5.13

    在 Vue 中,可以利用 v-model 语法糖实现数据的双向绑定,例如:

    <div id="app">
         <input 
         type="text" 
         v-model="id" 
         placeholder="please enter your id"
         />
         <p>your id is:  {{ id | formatId }}</p>
    </div>
    window.onload = function() {    
        Vue.filter('formatId', function(v) {
            return v.length < 10 && v.length > 0 ? v.padStart(10, '0') : v;
        });
    
        new Vue({
            el: '#app',
            data: {
                id: ''
            }
    
        });
    };

    但是有时,我们可能希望用 模板 实现,那么情况就是这样:

    <div id="app">
         <my-ele :id="id"></my-ele>
    </div>
    window.onload = function() {
        Vue.component('my-ele', {
            template: `
            <div>
              <input type="text" v-model="id"/>
              <p>you id:  {{id | formatId}}</p>
            </div>
            `,
            props: ['id']
        });
    
        Vue.filter('formatId', function(v) {
            return v.length < 10 && v.length > 0 ? v.padStart(10, '0') : v;
        });
    
        new Vue({
            el: '#app',
            data: {
                id: ''
            }
    
        });
    };

    目前为止,都是比较简单的,问题就在于,有时,我们还需要用 render() 函数来实现:

    <div id="app">
           <my-ele
            :val-par="id"
            @input-par="id=arguments[0]"
           ></my-ele>
    </div>
    window.onload = function() {
        Vue.component('my-ele', {
            render(createElement) {
                let self = this;
                let input = createElement('input', {                
                    domProps: {
                        type: 'text',
                        placeholder:'please enter your id',
                        value: this.valPar,
                    },
                    on: {
                        input(e) {
                            self.$emit('input-par', e.target.value);
                        }
                    }
                });
                let p = createElement('p', {
                    props: {
                        id: this.valPar
                    }
                }, 'your id is: '+this.formatId(this.valPar));
                return createElement('div', [input, p]);
            },
            props: ['valPar'],
            methods: {
                formatId(v) {
                    return v.length < 10 && v.length > 0 ? v.padStart(10, '0') : v;
                }
            }
        });
    
        new Vue({
            el: '#app',
            data: {
                id: ''
            }
        });
    };

    主要注意两点:

    1. value 的双向绑定在设置在 domProps 而不是 props
    2. 过滤器自己实现了个,并不能用 Vue.filter

    参考文档:

    https://cn.vuejs.org/v2/guide/render-function.html#深入-data-对象

  • 相关阅读:
    1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛
    2577 医院设置
    2488 绿豆蛙的归宿
    3315 时空跳跃者的魔法
    1079 回家
    1365 浴火银河星际跳跃
    1074 食物链 2001年NOI全国竞赛
    2596 售货员的难题
    wetask.cn领度任务全新试用体验
    多线程--生产者消费者--简单例子
  • 原文地址:https://www.cnblogs.com/xianshenglu/p/8485789.html
Copyright © 2020-2023  润新知