vue实现双向绑定其他元素以及自定义表单控件

时间: 2018-04-20阅读: 1024标签: 双向绑定

之前我们学过用 v-model 进行双向数据绑定:

<div id="root">
    <textarea class="textarea" v-model="comment"></textarea>
</div>

<script>

    var vm = new Vue({
        el:"#root",
        data:{
            comment:"这是一条评论"
        }
    });

</script>


而且,提到过,v-model 只能用于表单控件,如果用于其他元素,比如 p:

<p contenteditable="true" v-model="comment"></p>


那么就会报错:

v-model is not supported on this element type. If you are working with contenteditable, it's recommended to wrap a library dedicated for that purpose inside a custom component.

它会提示用 custom component,即自定义组件。在使用自定义组件之前,先来看看 v-model 的另外一种等价写法:

<textarea :value="comment" @input="comment = $event.target.value"></textarea>


该过程很好理解,首先,动态绑定输入控件的 value 属性到 comment 变量上,然后对 input 事件进行监控,实时同步 comment 的值。

如果用这种写法,就可以对 p 等元素进行双向绑定了。由于 p 元素没有 value 属性,可以使用 v-text 或者插值:

<p contenteditable="true" @input="comment = $event.target.innerText">{{ comment }}</p>

或者:

<p contenteditable="true" v-text="comment" @input="comment = $event.target.innerText"></p>


现在,我们对评论的内容进行过滤,效果如下:


可以使用自定义组件,比如:

<comment v-model="comment"></comment>


如何让组件的 v-model 生效呢?需要按照 Vue 的约定:

  1. 接受一个 value 属性

  2. 在有新的 value 时触发 input 事件


跟我们之前的写法类似:

Vue.component('comment',{
    props:['value'],
    template:`
        <textarea :value="value" @input="filterComment($event.target.value)"></textarea>
    `,
    methods: {
        filterComment(comment){
            this.$emit('input',comment)
        }
    }
});


这样就可以实现简单的双向绑定了,而且我们可以在 filterComment 方法中定义过滤规则:

filterComment(comment){
    var filterRst = (comment.indexOf('敏感词') >= 0 ? comment.replace(\敏感词\g,"河蟹") : comment);
    this.$emit('input',filterRst)
}


完整示例:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/vue/2.2.6/vue.js"></script>
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.4.1/css/bulma.css">
</head>
<body>
    <div id="root" class="container">
        <comment v-model="comment"></comment>
    </div>

    <script>
        Vue.component('comment',{
            props:['value'],
            template:`
                <textarea class="textarea" :value="value" @input="filterComment($event.target.value)"></textarea>
            `,
            data(){
                return {
                    sensitiveList:['包子','蛤蛤'],
                    replaceWord:'河蟹'
                }
            },
            methods: {
                filterComment(comment){
                    var that = this;
                    this.sensitiveList.forEach(function(word){
                        var regex = new RegExp(word,'g');;
                        comment = (comment.indexOf(word) >= 0 ? comment.replace(regex,that.replaceWord) : comment);
                    })
                    this.$emit('input',comment)
                }
            }
        });
    
        var vm = new Vue({
            el:"#root",
            data:{
                comment:'这是一条评论'
            }
        });
    </script>
</body>


转载来源:https://segmentfault.com/a/1190000009225098

站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/681

如何理解vue中的v-model?

说到v-model,就想到了双向数据绑定,而且往往最常见的是在表单元素<input>,<textarea>,<select>中的使用。那么为什么v-model双向数据绑定,自动更新元素呢?

Vue - 自定义组件双向绑定

无论在任何的语言或框架中,我们都提倡代码的复用性。对于Vue来说也是如此,相同的代码逻辑会被封装成组件,除了复用之外,更重要的是统一管理提高开发效率。我真就接手过一个项目,多个页面都会用到的列表

js 超浓缩 双向绑定

绑定确实是个有趣的话题。现在我的绑定器有了不少的功能1. 附着在Object对象上,一切以对象为中心2. 与页面元素进行双向绑定

简单实现一个vue的双向绑定

首先我们来看一些,vue的基本使用方法;然后我们根据使用方法,来设计一个类和一些基础的声明周期;获取根元素;生命周期 beforeCreate;获取初始数据;获取渲染函数

angular数据双向绑定的原理是什么?

页面中每绑定一个数据或者事件时,就会向$watch队列中加入一条$watch,当浏览器接受到可以被angular context(当事件触发,调用$apply进入angular context)处理的事件时,就会触发digest循环,它会遍历每一个$watch检查其属性和值是否发生改变

VUE:computed 和 v-model 配合使用,双向绑定失效

今天在实现一个表单赋值并修改的功能时,由于其中数值直观显示不美观,所以使用了 computed 计算属性,同时使用 v-model 的双向绑定,来处理显示。但却发现 v-model 的双向绑定失效了,控制台警告信息如下:

React input表单双向数据绑定仿Vue v-model实现

用过Vue的同学都知道,Vue里<input> 、 <textarea> 及 <select>等表单元素可以通过v-model指令实现双向数据绑定,也就是说,当用户通过交互改变表单的值时,表单绑定的数据也会同步响应,这一点也是Vue对开发人员非常友好的点之一。

vue双向绑定原理分析

当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理。vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter

vue2 实现 div contenteditable=true 类似于 v-model双向数据绑定的效果

用到 contenteditable=true的 div ,而在这个 div 上是使用 v-model 是没有效果的,这里的双向数据绑定该如何实现?解决思路:一自定义指令,二使用组件。

vue双向数据绑定失效_解决vue添加新属性实现双向绑定

vue框架目前在前端开发使用比较广了,但是又很多同学发现vue创建对象之后添加新的属性实现不了双向绑定,下面就简单介绍如何解决vue双向绑定出现失效的问题

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广