摘要:当需要和第三方的动画库,比如配合时会非常有用显式声明过渡类型新增需要给过渡元素添加事件侦听器来侦听过渡何时结束。在下例中我们使用注册一个自定义的过渡元素已被插入在动画结束后调用与相同然后用特性中渐近过渡与一起用时可以创建渐近过渡。
8.方法与事件处理器
方法处理器
可以用 v-on 指令监听 DOM 事件:
我们绑定了一个单击事件处理器到一个方法 greet。下面在 Vue 实例中定义这个方法:
var vm = new Vue({ el: "#example", data: { name: "Vue.js" }, // 在 `methods` 对象中定义方法 methods: { greet: function (event) { // 方法内 `this` 指向 vm alert("Hello " + this.name + "!") // `event` 是原生 DOM 事件 alert(event.target.tagName) } } }) // 也可以在 JavaScript 代码中调用方法 vm.greet() // -> "Hello Vue.js!"
内联语句处理器
除了直接绑定到一个方法,也可以用内联 JavaScript 语句:
new Vue({ el: "#example-2", methods: { say: function (msg) { alert(msg) } } })
类似于内联表达式,事件处理器限制为一个语句。
有时也需要在内联语句处理器中访问原生 DOM 事件。可以用特殊变量 $event 把它传入方法:
// ... methods: { say: function (msg, event) { // 现在我们可以访问原生事件对象 event.preventDefault() } }
事件修饰符
在事件处理器中经常需要调用 event.preventDefault() 或 event.stopPropagation()。尽管我们在方法内可以轻松做到,不过让方法是纯粹的数据逻辑而不处理 DOM 事件细节会更好。
为了解决这个问题,Vue.js 为 v-on 提供两个 事件修饰符:.prevent 与 .stop。你是否还记得修饰符是点号打头的指令后缀?
1.0.16 添加了两个额外的修饰符:
按键修饰符
在监听键盘事件时,我们经常需要检测 keyCode。Vue.js 允许为 v-on 添加按键修饰符:
记住所有的 keyCode 比较困难,Vue.js 为最常用的按键提供别名:
全部的按键别名:
enter tab delete esc space up down left right
1.0.8+: 支持单字母按键别名。
1.0.17+: 可以自定义按键别名:
// 可以使用 @keyup.f1 Vue.directive("on").keyCodes.f1 = 112
为什么在 HTML 中监听事件?
你可能注意到这种事件监听的方式违背了传统理念 “separation of concern”。不必担心,因为所有的 Vue.js 事件处理方法和表达式都严格绑定在当前视图的 ViewModel 上,它不会导致任何维护困难。实际上,使用 v-on 有几个好处:
扫一眼 HTML 模板便能轻松定位在 JavaScript 代码里对应的方法。 因为你无须在 JavaScript 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和 DOM 完全解耦,更易于测试。 当一个 ViewModel 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何自己清理它们。9.表单控件绑定
基础用法
可以用 v-model 指令在表单控件元素上创建双向数据绑定。根据控件类型它自动选取正确的方法更新元素。尽管有点神奇,v-model 不过是语法糖,在用户输入事件中更新数据,以及特别处理一些极端例子。
(1)Text: Message is: {{ message }}
(2)Multiline text: Multiline message is:{{ message }}
(3)Checkbox: 3-1.单个勾选框,逻辑值: 3-2.多个勾选框,绑定到同一个数组:
Checked names: {{ checkedNames | json }} new Vue({ el: "...", data: { checkedNames: [] } }) (4)Radio:
Picked: {{ picked }} (5)Select 5-1.单选: Selected: {{ selected }} 5-2.多选(绑定到一个数组):
Selected: {{ selected | json }} 5-3.动态选项,用 v-for 渲染: Selected: {{ selected }} new Vue({ el: "...", data: { selected: "A", options: [ { text: "One", value: "A" }, { text: "Two", value: "B" }, { text: "Three", value: "C" } ] } })
绑定 value
对于单选按钮,勾选框及选择框选项,v-model 绑定的 value 通常是静态字符串(对于勾选框是逻辑值):
但是有时我们想绑定 value 到 Vue 实例的一个动态属性上,这时可以用 v-bind 实现,并且这个属性的值可以不是字符串。
1.Checkbox // 当选中时 vm.toggle === vm.a // 当没有选中时 vm.toggle === vm.b 2.Radio // 当选中时 vm.pick === vm.a 3.Select Options // 当选中时 typeof vm.selected // -> "object" vm.selected.number // -> 123
参数特性
1.lazy
在默认情况下,v-model 在input 事件中同步输入框值与数据,可以添加一个特性 lazy,从而改到在 change 事件中同步:
2.number
如果想自动将用户的输入转为 Number 类型(如果原值的转换结果为 NaN 则返回原值),可以添加一个特性 number:
3.debounce
debounce 设置一个最小的延时,在每次敲击之后延时同步输入框的值与数据。如果每次更新都要进行高耗操作(例如在输入提示中 Ajax 请求),它较为有用。
注意 debounce 参数不会延迟 input 事件:它延迟“写入”底层数据。因此在使用 debounce 时应当用 vm.$watch() 响应数据的变化。若想延迟 DOM 事件,应当使用 debounce 过滤器。
10.过渡通过 Vue.js 的过渡系统,可以在元素从 DOM 中插入或移除时自动应用过渡效果。Vue.js 会在适当的时机为你触发 CSS 过渡或动画,你也可以提供相应的 JavaScript 钩子函数在过渡过程中执行自定义的 DOM 操作。
为了应用过渡效果,需要在目标元素上使用 transition 特性:
transition 特性可以与下面资源一起用:
v-if v-show v-for (只在插入和删除时触发,使用 vue-animated-list 插件) 动态组件 (介绍见组件) 在组件的根节点上,并且被 Vue 实例 DOM 方法(如 vm.$appendTo(el))触发。
当插入或删除带有过渡的元素时,Vue 将:
尝试以 ID "my-transition" 查找 JavaScript 过渡钩子对象——通过 Vue.transition(id, hooks) 或 transitions 选项注册。如果找到了,将在过渡的不同阶段调用相应的钩子。 自动嗅探目标元素是否有 CSS 过渡或动画,并在合适时添加/删除 CSS 类名。 如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作(插入/删除)在下一帧中立即执行。
CSS 过渡
示例:
典型的 CSS 过渡像这样:
hello
然后为 .expand-transition, .expand-enter 和 .expand-leave 添加 CSS 规则:
/* 必需 */ .expand-transition { transition: all .3s ease; height: 30px; padding: 10px; background-color: #eee; overflow: hidden; } /* .expand-enter 定义进入的开始状态 */ /* .expand-leave 定义离开的结束状态 */ .expand-enter, .expand-leave { height: 0; padding: 0 10px; opacity: 0; }
你可以在同一元素上通过动态绑定实现不同的过渡:
hellonew Vue({ el: "...", data: { show: false, transitionName: "fade" } })
另外,可以提供 JavaScript 钩子:
Vue.transition("expand", { beforeEnter: function (el) { el.textContent = "beforeEnter" }, enter: function (el) { el.textContent = "enter" }, afterEnter: function (el) { el.textContent = "afterEnter" }, enterCancelled: function (el) { // handle cancellation }, beforeLeave: function (el) { el.textContent = "beforeLeave" }, leave: function (el) { el.textContent = "leave" }, afterLeave: function (el) { el.textContent = "afterLeave" }, leaveCancelled: function (el) { // handle cancellation } })
过渡的 CSS 类名
类名的添加和切换取决于 transition 特性的值。比如 transition="fade",会有三个 CSS 类名:
.fade-transition 始终保留在元素上。 .fade-enter 定义进入过渡的开始状态。只应用一帧然后立即删除。 .fade-leave 定义离开过渡的结束状态。在离开过渡开始时生效,在它结束后删除。
如果 transition 特性没有值,类名默认是 .v-transition, .v-enter 和 .v-leave。
自定义过渡类名
1.0.14 新增
我们可以在过渡的 JavaScript 定义中声明自定义的 CSS 过渡类名。这些自定义类名会覆盖默认的类名。当需要和第三方的 CSS 动画库,比如 Animate.css 配合时会非常有用:
Watch me bounceVue.transition("bounce", { enterClass: "bounceInLeft", leaveClass: "bounceOutRight" })
显式声明 CSS 过渡类型
1.0.14 新增
Vue.js 需要给过渡元素添加事件侦听器来侦听过渡何时结束。基于所使用的 CSS,该事件要么是 transitionend,要么是 animationend。如果你只使用了两者中的一种,那么 Vue.js 将能够根据生效的 CSS 规则自动推测出对应的事件类型。但是,有些情况下一个元素可能需要同时带有两种类型的动画。比如你可能希望让 Vue 来触发一个 CSS animation,同时该元素在鼠标悬浮时又有 CSS transition 效果。这样的情况下,你需要显式地声明你希望 Vue 处理的动画类型 (animation 或是 transition):
Vue.transition("bounce", { // 该过渡效果将只侦听 `animationend` 事件 type: "animation" })
过渡流程详解
当 show 属性改变时,Vue.js 将相应地插入或删除
如果 show 变为 false,Vue.js 将: 调用 beforeLeave 钩子; 添加 v-leave 类名到元素上以触发过渡; 调用 leave 钩子; 等待过渡结束(监听 transitionend 事件); 从 DOM 中删除元素并删除 v-leave 类名; 调用 afterLeave 钩子。 如果 show 变为 true,Vue.js 将: 调用 beforeEnter 钩子; 添加 v-enter 类名到元素上; 把它插入 DOM; 调用 enter 钩子; 强制一次 CSS 布局,让 v-enter 确实生效。然后删除 v-enter 类名,以触发过渡,回到元素的原始状态; 等待过渡结束; 调用 afterEnter 钩子。
另外,如果在它的进入过渡还在进行中时删除元素,将调用 enterCancelled 钩子,以清理变动或 enter 创建的计时器。反过来对于离开过渡亦如是。
上面所有的钩子函数在调用时,它们的 this 均指向其所属的 Vue 实例。编译规则:过渡在哪个上下文中编译,它的 this 就指向哪个上下文。
最后,enter 和 leave 可以有第二个可选的回调参数,用于显式控制过渡如何结束。因此不必等待 CSS transitionend 事件, Vue.js 将等待你手工调用这个回调,以结束过渡。例如:
enter: function (el) { // 没有第二个参数 // 由 CSS transitionend 事件决定过渡何时结束 } vs. enter: function (el, done) { // 有第二个参数 // 过渡只有在调用 `done` 时结束 }
当多个元素一起过渡时,Vue.js 会批量处理,只强制一次布局。
CSS 动画
CSS 动画用法同 CSS 过渡,区别是在动画中 v-enter 类名在节点插入 DOM 后不会立即删除,而是在 animationend 事件触发时删除。
示例: (省略了兼容性前缀)
Look at me!
.bounce-transition {
display: inline-block; /* 否则 scale 动画不起作用 */
}
.bounce-enter {
animation: bounce-in .5s;
}
.bounce-leave {
animation: bounce-out .5s;
}
@keyframes bounce-in {
0% {
transform: scale(0);
}
50% {
transform: scale(1.5);
}
100% {
transform: scale(1);
}
}
@keyframes bounce-out {
0% {
transform: scale(1);
}
50% {
transform: scale(1.5);
}
100% {
transform: scale(0);
}
}
JavaScript 过渡
也可以只使用 JavaScript 钩子,不用定义任何 CSS 规则。当只使用 JavaScript 过渡时,enter 和 leave 钩子需要调用 done 回调,否则它们将被同步调用,过渡将立即结束。
为 JavaScript 过渡显式声明 css: false 是个好主意,Vue.js 将跳过 CSS 检测。这样也会阻止无意间让 CSS 规则干扰过渡。
在下例中我们使用 jQuery 注册一个自定义的 JavaScript 过渡:
Vue.transition("fade", { css: false, enter: function (el, done) { // 元素已被插入 DOM // 在动画结束后调用 done $(el) .css("opacity", 0) .animate({ opacity: 1 }, 1000, done) }, enterCancelled: function (el) { $(el).stop() }, leave: function (el, done) { // 与 enter 相同 $(el).animate({ opacity: 0 }, 1000, done) }, leaveCancelled: function (el) { $(el).stop() } })
然后用 transition 特性中:
渐近过渡
transition 与 v-for 一起用时可以创建渐近过渡。给过渡元素添加一个特性 stagger, enter-stagger 或 leave-stagger:
或者,提供一个钩子 stagger, enter-stagger 或 leave-stagger,以更好的控制:
Vue.transition("stagger", { stagger: function (index) { // 每个过渡项目增加 50ms 延时 // 但是最大延时限制为 300ms return Math.min(300, index * 50) } })
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/80175.html
摘要:指令带有前缀,以表示它们是提供的特殊属性。最后,我们需要为赋值世界舞王尼古拉斯赵四世界舞王尼古拉斯赵四初学就到这里了,相信你已经在脑子里确定了的原理的概念也已经非常清楚了,希望你能够在学习的道路上越走越远,最后感谢你的浏览。 vue.js vue介绍 Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量...
摘要:它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。状态自管理应用包含以下几个部分,驱动应用的数据源,以声明方式将映射到视图,响应在上的用户输入导致的状态变化。 事情发生在上周(2019-06-06)团队技术分享的时候。起因在于一个问题:vue 中多个组件如何使用同一个变量,我们叫这个变量为 baseConfig 吧。说实话我没想到那么多人不理解...
摘要:将路由写法改为定义路由的方法跳转路由字符串对象命名的路由带查询参数,变成下一章讲解状态管理以上代码代码亲测可用,托管在上面,欢迎参考文献效果图 上一篇讲了Vue起步:环境的搭建用webpack打包vue 下面讲一下vue路由vue-router 8.使用路由vue-router2 首先安装 vue-router: npm install vue-router --save 修改mai...
阅读 3419·2021-10-20 13:49
阅读 2791·2021-09-29 09:34
阅读 3690·2021-09-01 11:29
阅读 3079·2019-08-30 11:01
阅读 836·2019-08-29 17:10
阅读 864·2019-08-29 12:48
阅读 2774·2019-08-29 12:40
阅读 1345·2019-08-29 12:30