Vue 实现双向绑定的几种方法
1. v-model 指令 <input v-model="text" />
上例不过是一个语法糖,展开来是:
<input
:value="text"
@input="e => text = e.target.value"
/>
2. .sync 修饰符
<my-dialog :visible.sync="dialogVisible" />
这也是一个语法糖,剥开来是:
<my-dialog
:visible="dialogVisible"
@update:visible="newVisible => dialogVisible = newVisible"
/>
my-dialog 组件在 visible 变化时 this.$emit('update:visible', newVisible)
即可。
3. model 属性 (JSX/渲染函数中)
Vue 在 2.2.0 版本以后,允许自定义组件的 v-model ,这就导致在 JSX / 渲染函数中实现 v-model 时得考虑组件的不同配置,不能一律如此(假使 my-dialog 组件的 model 为 { prop: 'visible', event: 'change' } ):
{
render(h) {
return h('my-dialog', {
props: { value: this.dialogVisible },
on: { input: newVisible => this.dialogVisible = newVisible }
})
}
}
//前端全栈学习交流圈:866109386
//面向1-3经验年前端开发人员
//帮助突破技术瓶颈,提升思维能力
而应如此:
{
render(h) {
return h('my-dialog', {
props: { visible: this.dialogVisible },
on: { change: newVisible => this.dialogVisible = newVisible }
})
}
}
然而,利用 model 属性,完全可以做到不用管它 prop 、 event 的目的:
{
render(h) {
return h('my-dialog', {
model: {
value: this.dialogVisible,
callback: newVisible => this.dialogVisible = newVisible
}
})
}
}
JSX 中这样使用:
{
render() {
return (
<my-dialog
{...{
model: {
value: this.dialogVisible,
callback: newVisible => this.dialogVisible = newVisible
}
}}
/>
)
}
}
//前端全栈学习交流圈:866109386
//面向1-3经验年前端开发人员
//帮助突破技术瓶颈,提升思维能力
4. vue-better-sync 插件
有需求如此:开发一个 Prompt 组件,要求同步用户的输入,点击按钮可关闭弹窗。
一般我们会这样做:
<template>
<div v-show="_visible">
<div>完善个人信息</div>
<div>
<div>尊姓大名?</div>
<input v-model="_answer" />
</div>
<div>
<button @click="_visible = !_visible">确认</button>
<button @click="_visible = !_visible">取消</button>
</div>
</div>
</template>
<script>
export default {
name: 'prompt',
props: {
answer: String,
visible: Boolean
},
computed: {
_answer: {
get() {
return this.answer
},
set(value) {
this.$emit('input', value)
}
},
_visible: {
get() {
return this.visible
},
set(value) {
this.$emit('update:visible', value)
}
}
}
}
</script>
//前端全栈学习交流圈:866109386
//面向1-3经验年前端开发人员
//帮助突破技术瓶颈,提升思维能力
写一两个组件还好,组件规模一旦扩大,写双向绑定真能写出毛病来。于是,为了解放生产力,有了 vue-better-sync 这个轮子,且看用它如何改造我们的 Prompt 组件:
<template>
<div v-show="actualVisible">
<div>完善个人信息</div>
<div>
<div>尊姓大名?</div>
<input v-model="actualAnswer" />
</div>
<div>
<button @click="syncVisible(!actualVisible)">确认</button>
<button @click="syncVisible(!actualVisible)">取消</button>
</div>
</div>
</template>
<script>
import VueBetterSync from 'vue-better-sync'
export default {
name: 'prompt',
mixins: [
VueBetterSync({
prop: 'answer', // 设置 v-model 的 prop
event: 'input' // 设置 v-model 的 event
})
],
props: {
answer: String,
visible: {
type: Boolean,
sync: true // visible 属性可用 .sync 双向绑定
}
}
}
</script>
vue-better-sync 统一了 v-model 和 .sync 传递数据的方式,你只需 this.actual${PropName} = newValue
或者 this.sync${PropName}(newValue)
即可将新数据传递给父组件。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
线程池中使用ThreadLocal方案
人工手打,翻译自:https://moelholm.com/2017/07/24/spring-4-3-using-a-taskdecorator-to-copy-mdc-data-to-async-threads 本来想自己写一篇关于线程池threadlocal的,偶然看到这篇文章觉得挺好的,便直接翻译了 尊重外国人写文章的习惯,如果你初次看到此类翻译可能会造成不愉悦,但如果你曾经看到过,那你一定明白我在说什么,有的地方加上我自己的理解和注释 在这篇文章里,我们将会演示如何从web线程里复制MDC数据到@Async注解的线程里,我们将会使用一个全新的 Spring Framework 4.3的特性: ThreadPoolTaskExecutor#setTaskDecorator() [set-task-decorator]. 下面是最终结果: 注意到倒数第二行和第三行:在这个log级别上输出了[userId:Duke],倒数第三行是在一个web线程里(一个使用@RestController注解的类)发出的,倒数第二行是在一个用了@Async注解的异步线程里发出的。本质上,MDC数据从...
-
下一篇
Docker与自动化测试及其测试实践
Docker 与自动化测试 对于重复枯燥的手动测试任务,可以考虑将其进行自动化改造。自动化的成本在于自动化程序的编写和维护,而收益在于节省了手动执行用例的时间。简而言之,如果收益大于成本,测试任务就有价值自动化,否则受益的只是测试人员的自动化技能得到了提升。利用 Docker 的快速部署、环境共享等特性,可以大大减少自动化的成本,使很多原本没有价值自动化的测试任务变为了有价值自动化的任务,大大提升了项目效率。 那么如果自动化测试已经运行在了虚拟机中,是否有必要使用 Docker 技术将其进行改造?这个就要具体问题具体分析了。笔者并不赞同将所有测试任务一刀切的进行容器化改造。如果当前虚拟机已经满足测试需求,你就需要评估一下引入 Docker 进行改造所需的成本,其中包含学习 Docker 技术所需要的时间成本。反之,如果虚拟机无法满足当前的测试需求,可以考虑尽快引入 Docker 进行改造。 Docker 的约束 Build, Ship, and Run Any App, Anywhere. 这是 Docker 公司高调宣称的口号,即在任何平台都可以构建、部署、运行任何应用。然而,由于...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程