{"id":61,"date":"2022-05-29T12:47:01","date_gmt":"2022-05-29T04:47:01","guid":{"rendered":"http:\/\/www.33weixin.com\/index\/?p=61"},"modified":"2022-05-29T12:47:30","modified_gmt":"2022-05-29T04:47:30","slug":"%e8%bf%87%e6%b8%a1%e6%95%88%e6%9e%9c","status":"publish","type":"post","link":"http:\/\/www.33weixin.com\/index\/index.php\/2022\/05\/29\/%e8%bf%87%e6%b8%a1%e6%95%88%e6%9e%9c\/","title":{"rendered":"\u8fc7\u6e21\u6548\u679c"},"content":{"rendered":"\n<p><\/p>\n\n\n<h2 id=\"\u6982\u8ff0\">\u6982\u8ff0<\/h2>\n<p>Vue \u5728\u63d2\u5165\u3001\u66f4\u65b0\u6216\u8005\u79fb\u9664 DOM \u65f6\uff0c\u63d0\u4f9b\u591a\u79cd\u4e0d\u540c\u65b9\u5f0f\u7684\u5e94\u7528\u8fc7\u6e21\u6548\u679c\u3002 \u5305\u62ec\u4ee5\u4e0b\u5de5\u5177\uff1a<\/p>\n<ul>\n<li>\u5728 CSS \u8fc7\u6e21\u548c\u52a8\u753b\u4e2d\u81ea\u52a8\u5e94\u7528 class<\/li>\n<li>\u53ef\u4ee5\u914d\u5408\u4f7f\u7528\u7b2c\u4e09\u65b9 CSS \u52a8\u753b\u5e93\uff0c\u5982 Animate.css<\/li>\n<li>\u5728\u8fc7\u6e21\u94a9\u5b50\u51fd\u6570\u4e2d\u4f7f\u7528 JavaScript \u76f4\u63a5\u64cd\u4f5c DOM<\/li>\n<li>\u53ef\u4ee5\u914d\u5408\u4f7f\u7528\u7b2c\u4e09\u65b9 JavaScript \u52a8\u753b\u5e93\uff0c\u5982 Velocity.js<\/li>\n<\/ul>\n<p>\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u53ea\u4f1a\u8bb2\u5230\u8fdb\u5165\u3001\u79bb\u5f00\u548c\u5217\u8868\u7684\u8fc7\u6e21\uff0c \u4f60\u4e5f\u53ef\u4ee5\u770b\u4e0b\u4e00\u8282\u7684\u00a0<a href=\"http:\/\/caibaojian.com\/vue\/guide\/transitioning-state.html\">\u7ba1\u7406\u8fc7\u6e21\u72b6\u6001<\/a>.<\/p>\n<h2 id=\"\u5355\u5143\u7d20\u7ec4\u4ef6\u7684\u8fc7\u6e21\">\u5355\u5143\u7d20\/\u7ec4\u4ef6\u7684\u8fc7\u6e21<\/h2>\n<p>Vue \u63d0\u4f9b\u4e86\u00a0<code>transition<\/code>\u00a0\u7684\u5c01\u88c5\u7ec4\u4ef6\uff0c\u5728\u4e0b\u5217\u60c5\u5f62\u4e2d\uff0c\u53ef\u4ee5\u7ed9\u4efb\u4f55\u5143\u7d20\u548c\u7ec4\u4ef6\u6dfb\u52a0 entering\/leaving \u8fc7\u6e21<\/p>\n<ul>\n<li>\u6761\u4ef6\u6e32\u67d3 \uff08\u4f7f\u7528\u00a0<code>v-if<\/code>\uff09<\/li>\n<li>\u6761\u4ef6\u5c55\u793a \uff08\u4f7f\u7528\u00a0<code>v-show<\/code>\uff09<\/li>\n<li>\u52a8\u6001\u7ec4\u4ef6<\/li>\n<li>\u7ec4\u4ef6\u6839\u8282\u70b9<\/li>\n<\/ul>\n<p>\u8fd9\u91cc\u662f\u4e00\u4e2a\u5178\u578b\u7684\u4f8b\u5b50\uff1a<\/p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"demo\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">v-on:click<\/span>=<span class=\"hljs-string\">\"show = !show\"<\/span>&gt;<\/span>\n    Toggle\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">transition<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"fade\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">v-if<\/span>=<span class=\"hljs-string\">\"show\"<\/span>&gt;<\/span>hello<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">transition<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/code><\/pre>\n<pre><code class=\"lang-js\"><span class=\"hljs-keyword\">new<\/span> Vue({\n  el: <span class=\"hljs-string\">'#demo'<\/span>,\n  data: {\n    show: <span class=\"hljs-literal\">true<\/span>\n  }\n})\n<\/code><\/pre>\n<pre><code class=\"lang-css\"><span class=\"hljs-selector-class\">.fade-enter-active<\/span>, <span class=\"hljs-selector-class\">.fade-leave-active<\/span> {\n  <span class=\"hljs-attribute\">transition<\/span>: opacity .<span class=\"hljs-number\">5s<\/span>\n}\n<span class=\"hljs-selector-class\">.fade-enter<\/span>, <span class=\"hljs-selector-class\">.fade-leave-active<\/span> {\n  <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">0<\/span>\n}\n<\/code><\/pre>\n<div id=\"demo\"><button>Toggle<\/button>\n<p>hello<\/p>\n<\/div>\n<p>\u5143\u7d20\u5c01\u88c5\u6210\u8fc7\u6e21\u7ec4\u4ef6\u4e4b\u540e\uff0c\u5728\u9047\u5230\u63d2\u5165\u6216\u5220\u9664\u65f6\uff0cVue \u5c06 1. \u81ea\u52a8\u55c5\u63a2\u76ee\u6807\u5143\u7d20\u662f\u5426\u6709 CSS \u8fc7\u6e21\u6216\u52a8\u753b\uff0c\u5e76\u5728\u5408\u9002\u65f6\u6dfb\u52a0\/\u5220\u9664 CSS \u7c7b\u540d\u3002 2. \u5982\u679c\u8fc7\u6e21\u7ec4\u4ef6\u8bbe\u7f6e\u4e86\u8fc7\u6e21\u7684 [JavaScript \u94a9\u5b50\u51fd\u6570](#JavaScript-Hooks)\uff0c\u4f1a\u5728\u76f8\u5e94\u7684\u9636\u6bb5\u8c03\u7528\u94a9\u5b50\u51fd\u6570\u3002 3. \u5982\u679c\u6ca1\u6709\u627e\u5230 JavaScript \u94a9\u5b50\u5e76\u4e14\u4e5f\u6ca1\u6709\u68c0\u6d4b\u5230 CSS \u8fc7\u6e21\/\u52a8\u753b\uff0cDOM \u64cd\u4f5c\uff08\u63d2\u5165\/\u5220\u9664\uff09\u5728\u4e0b\u4e00\u5e27\u4e2d\u7acb\u5373\u6267\u884c\u3002(\u6ce8\u610f\uff1a\u6b64\u6307\u6d4f\u89c8\u5668\u9010\u5e27\u52a8\u753b\u673a\u5236\uff0c\u4e0e Vue\uff0c\u548cVue\u7684 `nextTick` \u6982\u5ff5\u4e0d\u540c) ### \u8fc7\u6e21\u7684-CSS-\u7c7b\u540d \u4f1a\u6709 4 \u4e2a(CSS)\u7c7b\u540d\u5728 enter\/leave \u7684\u8fc7\u6e21\u4e2d\u5207\u6362 1. `v-enter`: \u5b9a\u4e49\u8fdb\u5165\u8fc7\u6e21\u7684\u5f00\u59cb\u72b6\u6001\u3002\u5728\u5143\u7d20\u88ab\u63d2\u5165\u65f6\u751f\u6548\uff0c\u5728\u4e0b\u4e00\u4e2a\u5e27\u79fb\u9664\u3002 2. `v-enter-active`: \u5b9a\u4e49\u8fdb\u5165\u8fc7\u6e21\u7684\u7ed3\u675f\u72b6\u6001\u3002\u5728\u5143\u7d20\u88ab\u63d2\u5165\u65f6\u751f\u6548\uff0c\u5728 `transition\/animation` \u5b8c\u6210\u4e4b\u540e\u79fb\u9664\u3002 3. `v-leave`: \u5b9a\u4e49\u79bb\u5f00\u8fc7\u6e21\u7684\u5f00\u59cb\u72b6\u6001\u3002\u5728\u79bb\u5f00\u8fc7\u6e21\u88ab\u89e6\u53d1\u65f6\u751f\u6548\uff0c\u5728\u4e0b\u4e00\u4e2a\u5e27\u79fb\u9664\u3002 4. `v-leave-active`: \u5b9a\u4e49\u79bb\u5f00\u8fc7\u6e21\u7684\u7ed3\u675f\u72b6\u6001\u3002\u5728\u79bb\u5f00\u8fc7\u6e21\u88ab\u89e6\u53d1\u65f6\u751f\u6548\uff0c\u5728 `transition\/animation` \u5b8c\u6210\u4e4b\u540e\u79fb\u9664\u3002 ![Transition Diagram](\/images\/transition.png) \u5bf9\u4e8e\u8fd9\u4e9b\u5728 `enter\/leave` \u8fc7\u6e21\u4e2d\u5207\u6362\u7684\u7c7b\u540d\uff0c`v-` \u662f\u8fd9\u4e9b\u7c7b\u540d\u7684\u524d\u7f00\u3002\u4f7f\u7528 &#8220; \u53ef\u4ee5\u91cd\u7f6e\u524d\u7f00\uff0c\u6bd4\u5982 `v-enter` \u66ff\u6362\u4e3a `my-transition-enter`\u3002 `v-enter-active` \u548c `v-leave-active` \u53ef\u4ee5\u63a7\u5236 \u8fdb\u5165\/\u79bb\u5f00 \u8fc7\u6e21\u7684\u4e0d\u540c\u9636\u6bb5\uff0c\u5728\u4e0b\u9762\u7ae0\u8282\u4f1a\u6709\u4e2a\u793a\u4f8b\u8bf4\u660e\u3002 ### CSS \u8fc7\u6e21 \u5e38\u7528\u7684\u8fc7\u6e21\u90fd\u662f\u4f7f\u7528 CSS \u8fc7\u6e21\u3002 \u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u4f8b\u5b50\uff1a &#8220;` html<\/p>\n<div id=\"example-1\"><button>Toggle render<\/button>\n<p>hello<\/p>\n<\/div>\n<p>&#8220;` &#8220;` js new Vue({ el: &#8216;#example-1&#8217;, data: { show: true } }) &#8220;` &#8220;` css \/* \u53ef\u4ee5\u8bbe\u7f6e\u4e0d\u540c\u7684\u8fdb\u5165\u548c\u79bb\u5f00\u52a8\u753b *\/ \/* \u8bbe\u7f6e\u6301\u7eed\u65f6\u95f4\u548c\u52a8\u753b\u51fd\u6570 *\/ .slide-fade-enter-active { transition: all .3s ease; } .slide-fade-leave-active { transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0); } .slide-fade-enter, .slide-fade-leave-active { padding-left: 10px; opacity: 0; } &#8220;`<\/p>\n<div id=\"example-1\" class=\"demo\"><button>Toggle<\/button>\n<p>hello<\/p>\n<\/div>\n<p>### CSS \u52a8\u753b CSS \u52a8\u753b\u7528\u6cd5\u540c CSS \u8fc7\u6e21\uff0c\u533a\u522b\u662f\u5728\u52a8\u753b\u4e2d `v-enter` \u7c7b\u540d\u5728\u8282\u70b9\u63d2\u5165 DOM \u540e\u4e0d\u4f1a\u7acb\u5373\u5220\u9664\uff0c\u800c\u662f\u5728 `animationend` \u4e8b\u4ef6\u89e6\u53d1\u65f6\u5220\u9664\u3002 \u793a\u4f8b\uff1a (\u7701\u7565\u4e86\u517c\u5bb9\u6027\u524d\u7f00) &#8220;` html<\/p>\n<div id=\"example-2\"><button>Toggle show<\/button>\n<p>Look at me!<\/p>\n<\/div>\n<p>&#8220;` &#8220;` js new Vue({ el: &#8216;#example-2&#8217;, data: { show: true } }) &#8220;` &#8220;` css .bounce-enter-active { animation: bounce-in .5s; } .bounce-leave-active { 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); } } &#8220;`<\/p>\n<div id=\"example-2\" class=\"demo\"><button>Toggle show<\/button>\n<p>Look at me!<\/p>\n<\/div>\n<p>### \u81ea\u5b9a\u4e49\u8fc7\u6e21\u7c7b\u540d \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u7279\u6027\u6765\u81ea\u5b9a\u4e49\u8fc7\u6e21\u7c7b\u540d\uff1a &#8211; `enter-class` &#8211; `enter-active-class` &#8211; `leave-class` &#8211; `leave-active-class` \u4ed6\u4eec\u7684\u4f18\u5148\u7ea7\u9ad8\u4e8e\u666e\u901a\u7684\u7c7b\u540d\uff0c\u8fd9\u5bf9\u4e8e Vue \u7684\u8fc7\u6e21\u7cfb\u7edf\u548c\u5176\u4ed6\u7b2c\u4e09\u65b9 CSS \u52a8\u753b\u5e93\uff0c\u5982 [Animate.css](https:\/\/daneden.github.io\/animate.css\/) \u7ed3\u5408\u4f7f\u7528\u5341\u5206\u6709\u7528\u3002 \u793a\u4f8b\uff1a &#8220;` html<\/p>\n<div id=\"example-3\"><button>Toggle render<\/button>\n<p>hello<\/p>\n<\/div>\n<p>&#8220;` &#8220;` js new Vue({ el: &#8216;#example-3&#8217;, data: { show: true } }) &#8220;`<\/p>\n<div id=\"example-3\" class=\"demo\"><button>Toggle render<\/button>\n<p>hello<\/p>\n<\/div>\n<p>### \u540c\u65f6\u4f7f\u7528 Transitions \u548c Animations Vue \u4e3a\u4e86\u77e5\u9053\u8fc7\u6e21\u7684\u5b8c\u6210\uff0c\u5fc5\u987b\u8bbe\u7f6e\u76f8\u5e94\u7684\u4e8b\u4ef6\u76d1\u542c\u5668\u3002\u5b83\u53ef\u4ee5\u662f `transitionend` \u6216 `animationend` \uff0c\u8fd9\u53d6\u51b3\u4e8e\u7ed9\u5143\u7d20\u5e94\u7528\u7684 CSS \u89c4\u5219\u3002\u5982\u679c\u4f60\u4f7f\u7528\u5176\u4e2d\u4efb\u4f55\u4e00\u79cd\uff0cVue \u80fd\u81ea\u52a8\u8bc6\u522b\u7c7b\u578b\u5e76\u8bbe\u7f6e\u76d1\u542c\u3002 \u4f46\u662f\uff0c\u5728\u4e00\u4e9b\u573a\u666f\u4e2d\uff0c\u4f60\u9700\u8981\u7ed9\u540c\u4e00\u4e2a\u5143\u7d20\u540c\u65f6\u8bbe\u7f6e\u4e24\u79cd\u8fc7\u6e21\u52a8\u6548\uff0c\u6bd4\u5982 `animation` \u5f88\u5feb\u7684\u88ab\u89e6\u53d1\u5e76\u5b8c\u6210\u4e86\uff0c\u800c `transition` \u6548\u679c\u8fd8\u6ca1\u7ed3\u675f\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e2d\uff0c\u4f60\u5c31\u9700\u8981\u4f7f\u7528 `type` \u7279\u6027\u5e76\u8bbe\u7f6e `animation` \u6216 `transition` \u6765\u660e\u786e\u58f0\u660e\u4f60\u9700\u8981 Vue \u76d1\u542c\u7684\u7c7b\u578b\u3002 ### JavaScript \u94a9\u5b50 \u53ef\u4ee5\u5728\u5c5e\u6027\u4e2d\u58f0\u660e JavaScript \u94a9\u5b50 &#8220;` html\u00a0&#8220;` &#8220;` js \/\/ &#8230; methods: { \/\/ &#8212;&#8212;&#8211; \/\/ \u8fdb\u5165\u4e2d \/\/ &#8212;&#8212;&#8211; beforeEnter: function (el) { \/\/ &#8230; }, \/\/ \u6b64\u56de\u8c03\u51fd\u6570\u662f\u53ef\u9009\u9879\u7684\u8bbe\u7f6e \/\/ \u4e0e CSS \u7ed3\u5408\u65f6\u4f7f\u7528 enter: function (el, done) { \/\/ &#8230; done() }, afterEnter: function (el) { \/\/ &#8230; }, enterCancelled: function (el) { \/\/ &#8230; }, \/\/ &#8212;&#8212;&#8211; \/\/ \u79bb\u5f00\u65f6 \/\/ &#8212;&#8212;&#8211; beforeLeave: function (el) { \/\/ &#8230; }, \/\/ \u6b64\u56de\u8c03\u51fd\u6570\u662f\u53ef\u9009\u9879\u7684\u8bbe\u7f6e \/\/ \u4e0e CSS \u7ed3\u5408\u65f6\u4f7f\u7528 leave: function (el, done) { \/\/ &#8230; done() }, afterLeave: function (el) { \/\/ &#8230; }, \/\/ leaveCancelled \u53ea\u7528\u4e8e v-show \u4e2d leaveCancelled: function (el) { \/\/ &#8230; } } &#8220;` \u8fd9\u4e9b\u94a9\u5b50\u51fd\u6570\u53ef\u4ee5\u7ed3\u5408 CSS `transitions\/animations` \u4f7f\u7528\uff0c\u4e5f\u53ef\u4ee5\u5355\u72ec\u4f7f\u7528\u3002<\/p>\n<p class=\"tip\">\u5f53\u53ea\u7528 JavaScript \u8fc7\u6e21\u7684\u65f6\u5019\uff0c ** \u5728 `enter` \u548c `leave` \u4e2d\uff0c\u56de\u8c03\u51fd\u6570 `done` \u662f\u5fc5\u987b\u7684 **\u3002 \u5426\u5219\uff0c\u5b83\u4eec\u4f1a\u88ab\u540c\u6b65\u8c03\u7528\uff0c\u8fc7\u6e21\u4f1a\u7acb\u5373\u5b8c\u6210\u3002<\/p>\n<p class=\"tip\">\u63a8\u8350\u5bf9\u4e8e\u4ec5\u4f7f\u7528 JavaScript \u8fc7\u6e21\u7684\u5143\u7d20\u6dfb\u52a0 `v-bind:css=&#8221;false&#8221;`\uff0cVue \u4f1a\u8df3\u8fc7 CSS \u7684\u68c0\u6d4b\u3002\u8fd9\u4e5f\u53ef\u4ee5\u907f\u514d\u8fc7\u6e21\u8fc7\u7a0b\u4e2d CSS \u7684\u5f71\u54cd\u3002<\/p>\n<p>\u4e00\u4e2a\u4f7f\u7528 Velocity.js \u7684\u7b80\u5355\u4f8b\u5b50\uff1a &#8220;` html<\/p>\n<div id=\"example-4\"><button>Toggle<\/button><\/div>\n<p>&#8220;` &#8220;` js new Vue({ el: &#8216;#example-4&#8217;, data: { show: false }, methods: { beforeEnter: function (el) { el.style.opacity = 0 el.style.transformOrigin = &#8216;left&#8217; }, enter: function (el, done) { Velocity(el, { opacity: 1, fontSize: &#8216;1.4em&#8217; }, { duration: 300 }) Velocity(el, { fontSize: &#8216;1em&#8217; }, { complete: done }) }, leave: function (el, done) { Velocity(el, { translateX: &#8217;15px&#8217;, rotateZ: &#8217;50deg&#8217; }, { duration: 600 }) Velocity(el, { rotateZ: &#8216;100deg&#8217; }, { loop: 2 }) Velocity(el, { rotateZ: &#8217;45deg&#8217;, translateY: &#8217;30px&#8217;, translateX: &#8217;30px&#8217;, opacity: 0 }, { complete: done }) } } }) &#8220;`<\/p>\n<div id=\"example-4\" class=\"demo\"><button>Toggle<\/button>\n<p>Demo<\/p>\n<\/div>\n<p>## \u521d\u59cb\u6e32\u67d3\u7684\u8fc7\u6e21 \u53ef\u4ee5\u901a\u8fc7 `appear` \u7279\u6027\u8bbe\u7f6e\u8282\u70b9\u7684\u5728\u521d\u59cb\u6e32\u67d3\u7684\u8fc7\u6e21 &#8220;` html\u00a0&#8220;` \u8fd9\u91cc\u9ed8\u8ba4\u548c\u8fdb\u5165\u548c\u79bb\u5f00\u8fc7\u6e21\u4e00\u6837\uff0c\u540c\u6837\u4e5f\u53ef\u4ee5\u81ea\u5b9a\u4e49 CSS \u7c7b\u540d\u3002 &#8220;` html\u00a0&#8220;` \u81ea\u5b9a\u4e49 JavaScript \u94a9\u5b50\uff1a &#8220;` html\u00a0&#8220;` ## \u591a\u4e2a\u5143\u7d20\u7684\u8fc7\u6e21 \u6211\u4eec\u4e4b\u540e\u8ba8\u8bba [\u591a\u4e2a\u7ec4\u4ef6\u7684\u8fc7\u6e21](#\u591a\u4e2a\u7ec4\u4ef6\u7684\u8fc7\u6e21), \u5bf9\u4e8e\u539f\u751f\u6807\u7b7e\u53ef\u4ee5\u4f7f\u7528 `v-if`\/`v-else` \u3002\u6700\u5e38\u89c1\u7684\u591a\u6807\u7b7e\u8fc7\u6e21\u662f\u4e00\u4e2a\u5217\u8868\u548c\u63cf\u8ff0\u8fd9\u4e2a\u5217\u8868\u4e3a\u7a7a\u6d88\u606f\u7684\u5143\u7d20\uff1a &#8220;` html<\/p>\n<p>Sorry, no items found.<\/p>\n<p>&#8220;` \u53ef\u4ee5\u8fd9\u6837\u4f7f\u7528\uff0c\u4f46\u662f\u6709\u4e00\u70b9\u9700\u8981\u6ce8\u610f\uff1a<\/p>\n<p class=\"tip\">\u5f53\u6709**\u76f8\u540c\u6807\u7b7e\u540d**\u7684\u5143\u7d20\u5207\u6362\u65f6\uff0c\u9700\u8981\u901a\u8fc7 `key` \u7279\u6027\u8bbe\u7f6e\u552f\u4e00\u7684\u503c\u6765\u6807\u8bb0\u4ee5\u8ba9 Vue \u533a\u5206\u5b83\u4eec\uff0c\u5426\u5219 Vue \u4e3a\u4e86\u6548\u7387\u53ea\u4f1a\u66ff\u6362\u76f8\u540c\u6807\u7b7e\u5185\u90e8\u7684\u5185\u5bb9\u3002\u5373\u4f7f\u5728\u6280\u672f\u4e0a\u6ca1\u6709\u5fc5\u8981\uff0c**\u7ed9\u5728 &#8220; \u7ec4\u4ef6\u4e2d\u7684\u591a\u4e2a\u5143\u7d20\u8bbe\u7f6e key \u662f\u4e00\u4e2a\u66f4\u597d\u7684\u5b9e\u8df5\u3002**<\/p>\n<p>\u793a\u4f8b: &#8220;` html\u00a0<button>Save<\/button>\u00a0<button>Edit<\/button>\u00a0&#8220;` \u5728\u4e00\u4e9b\u573a\u666f\u4e2d\uff0c\u4e5f\u53ef\u4ee5\u7ed9\u901a\u8fc7\u7ed9\u540c\u4e00\u4e2a\u5143\u7d20\u7684 `key` \u7279\u6027\u8bbe\u7f6e\u4e0d\u540c\u7684\u72b6\u6001\u6765\u4ee3\u66ff `v-if` \u548c `v-else`\uff0c\u4e0a\u9762\u7684\u4f8b\u5b50\u53ef\u4ee5\u91cd\u5199\u4e3a\uff1a &#8220;` html\u00a0<button><\/button>\u00a0&#8220;` \u4f7f\u7528\u591a\u4e2a `v-if` \u7684\u591a\u4e2a\u5143\u7d20\u7684\u8fc7\u6e21\u53ef\u4ee5\u91cd\u5199\u4e3a\u7ed1\u5b9a\u4e86\u52a8\u6001\u5c5e\u6027\u7684\u5355\u4e2a\u5143\u7d20\u8fc7\u6e21\u3002 \u4f8b\u5982\uff1a &#8220;` html\u00a0<button>Edit<\/button>\u00a0<button>Save<\/button>\u00a0<button>Cancel<\/button>\u00a0&#8220;` \u53ef\u4ee5\u91cd\u5199\u4e3a\uff1a &#8220;` html\u00a0<button><\/button>\u00a0&#8220;` &#8220;` js \/\/ &#8230; computed: { buttonMessage: function () { switch (docState) { case &#8216;saved&#8217;: return &#8216;Edit&#8217; case &#8216;edited&#8217;: return &#8216;Save&#8217; case &#8216;editing&#8217;: return &#8216;Cancel&#8217; } } } &#8220;` ### \u8fc7\u6e21\u6a21\u5f0f \u8fd9\u91cc\u8fd8\u6709\u4e00\u4e2a\u95ee\u9898\uff0c\u8bd5\u7740\u70b9\u51fb\u4e0b\u9762\u7684\u6309\u94ae\uff1a<\/p>\n<div id=\"no-mode-demo\" class=\"demo\"><button>off<\/button><\/div>\n<p>\u5728 &#8220;on&#8221; \u6309\u94ae\u548c &#8220;off&#8221; \u6309\u94ae\u7684\u8fc7\u6e21\u4e2d\uff0c\u4e24\u4e2a\u6309\u94ae\u90fd\u88ab\u91cd\u7ed8\u4e86\uff0c\u4e00\u4e2a\u79bb\u5f00\u8fc7\u6e21\u7684\u65f6\u5019\u53e6\u4e00\u4e2a\u5f00\u59cb\u8fdb\u5165\u8fc7\u6e21\u3002\u8fd9\u662f\u00a0<code>&lt;transition&gt;<\/code>\u00a0\u7684\u9ed8\u8ba4\u884c\u4e3a &#8211; \u8fdb\u5165\u548c\u79bb\u5f00\u540c\u65f6\u53d1\u751f\u3002<\/p>\n<p>\u5728\u5143\u7d20\u7edd\u5bf9\u5b9a\u4f4d\u5728\u5f7c\u6b64\u4e4b\u4e0a\u7684\u65f6\u5019\u8fd0\u884c\u6b63\u5e38\uff1a<\/p>\n<p>\u00a0<\/p>\n<div id=\"no-mode-absolute-demo\" class=\"demo\">\n<div class=\"no-mode-absolute-demo-wrapper\"><button>off<\/button><\/div>\n&lt;\/div&gt;<\/div>\n<p>\u00a0<\/p>\n<p>\u7136\u540e\uff0c\u6211\u4eec\u52a0\u4e0a translate \u8ba9\u5b83\u4eec\u8fd0\u52a8\u50cf\u6ed1\u52a8\u8fc7\u6e21\uff1a<\/p>\n<div id=\"no-mode-translate-demo\" class=\"demo\">\n<div class=\"no-mode-translate-demo-wrapper\"><button>off<\/button><\/div>\n<\/div>\n<p>\u540c\u65f6\u751f\u6548\u7684\u8fdb\u5165\u548c\u79bb\u5f00\u7684\u8fc7\u6e21\u4e0d\u80fd\u6ee1\u8db3\u6240\u6709\u8981\u6c42\uff0c\u6240\u4ee5 Vue \u63d0\u4f9b\u4e86 **\u8fc7\u6e21\u6a21\u5f0f** &#8211; `in-out`: \u65b0\u5143\u7d20\u5148\u8fdb\u884c\u8fc7\u6e21\uff0c\u5b8c\u6210\u4e4b\u540e\u5f53\u524d\u5143\u7d20\u8fc7\u6e21\u79bb\u5f00\u3002 &#8211; `out-in`: \u5f53\u524d\u5143\u7d20\u5148\u8fdb\u884c\u8fc7\u6e21\uff0c\u5b8c\u6210\u4e4b\u540e\u65b0\u5143\u7d20\u8fc7\u6e21\u8fdb\u5165\u3002 \u7528 `out-in` \u91cd\u5199\u4e4b\u524d\u7684\u5f00\u5173\u6309\u94ae\u8fc7\u6e21\uff1a &#8220;` html\u00a0&#8220;`<\/p>\n<div id=\"with-mode-demo\" class=\"demo\"><button>off<\/button><\/div>\n<p>\u53ea\u7528\u6dfb\u52a0\u4e00\u4e2a\u7b80\u5355\u7684\u7279\u6027\uff0c\u5c31\u89e3\u51b3\u4e86\u4e4b\u524d\u7684\u8fc7\u6e21\u95ee\u9898\u800c\u65e0\u9700\u4efb\u4f55\u989d\u5916\u7684\u4ee3\u7801\u3002 `in-out` \u6a21\u5f0f\u4e0d\u662f\u7ecf\u5e38\u7528\u5230\uff0c\u4f46\u5bf9\u4e8e\u4e00\u4e9b\u7a0d\u5fae\u4e0d\u540c\u7684\u8fc7\u6e21\u6548\u679c\u8fd8\u662f\u6709\u7528\u7684\u3002 \u5c06\u4e4b\u524d\u6ed1\u52a8\u6de1\u51fa\u7684\u4f8b\u5b50\u7ed3\u5408\uff1a<\/p>\n<div id=\"in-out-translate-demo\" class=\"demo\">\n<div class=\"in-out-translate-demo-wrapper\"><button>off<\/button><\/div>\n<\/div>\n<p>\u5f88\u9177\u5427\uff1f ## \u591a\u4e2a\u7ec4\u4ef6\u7684\u8fc7\u6e21 \u591a\u4e2a\u7ec4\u4ef6\u7684\u8fc7\u6e21\u5f88\u7b80\u5355\u5f88\u591a &#8211; \u6211\u4eec\u4e0d\u9700\u8981\u4f7f\u7528 `key` \u7279\u6027\u3002\u76f8\u53cd\uff0c\u6211\u4eec\u53ea\u9700\u8981\u4f7f\u7528[\u52a8\u6001\u7ec4\u4ef6](components.html#\u52a8\u6001\u7ec4\u4ef6): &#8220;` html\u00a0&#8220;` &#8220;` js new Vue({ el: &#8216;#transition-components-demo&#8217;, data: { view: &#8216;v-a&#8217; }, components: { &#8216;v-a&#8217;: { template: &#8216;<\/p>\n<div>Component A<\/div>\n<p>&#8216; }, &#8216;v-b&#8217;: { template: &#8216;<\/p>\n<div>Component B<\/div>\n<p>&#8216; } } }) &#8220;` &#8220;` css .component-fade-enter-active, .component-fade-leave-active { transition: opacity .3s ease; } .component-fade-enter, .component-fade-leave-active { opacity: 0; } &#8220;`<\/p>\n<div id=\"transition-components-demo\" class=\"demo\"><input id=\"a\" name=\"view\" type=\"radio\" value=\"v-a\" \/><label for=\"a\">A<\/label>\u00a0<input id=\"b\" name=\"view\" type=\"radio\" value=\"v-b\" \/><label for=\"b\">B<\/label>\n<div>Component A<\/div>\n<\/div>\n<h2 id=\"\u5217\u8868\u8fc7\u6e21\">\u5217\u8868\u8fc7\u6e21<\/h2>\n<p>\u76ee\u524d\u4e3a\u6b62\uff0c\u5173\u4e8e\u8fc7\u6e21\u6211\u4eec\u5df2\u7ecf\u8bb2\u5230\uff1a<\/p>\n<ul>\n<li>\u5355\u4e2a\u8282\u70b9<\/li>\n<li>\u4e00\u6b21\u6e32\u67d3\u591a\u4e2a\u8282\u70b9<\/li>\n<\/ul>\n<p>\u90a3\u4e48\u600e\u4e48\u540c\u65f6\u6e32\u67d3\u6574\u4e2a\u5217\u8868\uff0c\u6bd4\u5982\u4f7f\u7528\u00a0<code>v-for<\/code>\u00a0\uff1f\u5728\u8fd9\u79cd\u573a\u666f\u4e2d\uff0c\u4f7f\u7528\u00a0<code>&lt;transition-group&gt;<\/code>\u00a0\u7ec4\u4ef6\u3002\u5728\u6211\u4eec\u6df1\u5165\u4f8b\u5b50\u4e4b\u524d\uff0c\u5148\u4e86\u89e3\u5173\u4e8e\u8fd9\u4e2a\u7ec4\u4ef6\u7684\u51e0\u4e2a\u7279\u70b9\uff1a<\/p>\n<ul>\n<li>\u4e0d\u540c\u4e8e\u00a0<code>&lt;transition&gt;<\/code>\uff0c \u5b83\u4f1a\u4ee5\u4e00\u4e2a\u771f\u5b9e\u5143\u7d20\u5448\u73b0\uff1a\u9ed8\u8ba4\u4e3a\u4e00\u4e2a\u00a0<code>&lt;span&gt;<\/code>\u3002\u4f60\u4e5f\u53ef\u4ee5\u901a\u8fc7\u00a0<code>tag<\/code>\u00a0\u7279\u6027\u66f4\u6362\u4e3a\u5176\u4ed6\u5143\u7d20\u3002<\/li>\n<li>\u5143\u7d20\u00a0<strong>\u4e00\u5b9a\u9700\u8981<\/strong>\u00a0\u6307\u5b9a\u552f\u4e00\u7684\u00a0<code>key<\/code>\u00a0\u7279\u6027\u503c<\/li>\n<\/ul>\n<h3 id=\"\u5217\u8868\u7684\u8fdb\u5165\u548c\u79bb\u5f00\u8fc7\u6e21\">\u5217\u8868\u7684\u8fdb\u5165\u548c\u79bb\u5f00\u8fc7\u6e21<\/h3>\n<p>\u73b0\u5728\u8ba9\u6211\u4eec\u7531\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u6df1\u5165\uff0c\u8fdb\u5165\u548c\u79bb\u5f00\u7684\u8fc7\u6e21\u4f7f\u7528\u4e4b\u524d\u4e00\u6837\u7684 CSS \u7c7b\u540d\u3002<\/p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"list-demo\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"demo\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">v-on:click<\/span>=<span class=\"hljs-string\">\"add\"<\/span>&gt;<\/span>Add<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">v-on:click<\/span>=<span class=\"hljs-string\">\"remove\"<\/span>&gt;<\/span>Remove<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">transition-group<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"list\"<\/span> <span class=\"hljs-attr\">tag<\/span>=<span class=\"hljs-string\">\"p\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span> <span class=\"hljs-attr\">v-for<\/span>=<span class=\"hljs-string\">\"item in items\"<\/span> <span class=\"hljs-attr\">v-bind:key<\/span>=<span class=\"hljs-string\">\"item\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"list-item\"<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">transition-group<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/code><\/pre>\n<pre><code class=\"lang-js\"><span class=\"hljs-keyword\">new<\/span> Vue({\n  el: <span class=\"hljs-string\">'#list-demo'<\/span>,\n  data: {\n    items: [<span class=\"hljs-number\">1<\/span>,<span class=\"hljs-number\">2<\/span>,<span class=\"hljs-number\">3<\/span>,<span class=\"hljs-number\">4<\/span>,<span class=\"hljs-number\">5<\/span>,<span class=\"hljs-number\">6<\/span>,<span class=\"hljs-number\">7<\/span>,<span class=\"hljs-number\">8<\/span>,<span class=\"hljs-number\">9<\/span>],\n    nextNum: <span class=\"hljs-number\">10<\/span>\n  },\n  methods: {\n    randomIndex: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> () <\/span>{\n      <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-built_in\">Math<\/span>.floor(<span class=\"hljs-built_in\">Math<\/span>.random() * <span class=\"hljs-keyword\">this<\/span>.items.length)\n    },\n    add: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> () <\/span>{\n      <span class=\"hljs-keyword\">this<\/span>.items.splice(<span class=\"hljs-keyword\">this<\/span>.randomIndex(), <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-keyword\">this<\/span>.nextNum++)\n    },\n    remove: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> () <\/span>{\n      <span class=\"hljs-keyword\">this<\/span>.items.splice(<span class=\"hljs-keyword\">this<\/span>.randomIndex(), <span class=\"hljs-number\">1<\/span>)\n    },\n  }\n})\n<\/code><\/pre>\n<pre><code class=\"lang-css\"><span class=\"hljs-selector-class\">.list-item<\/span> {\n  <span class=\"hljs-attribute\">display<\/span>: inline-block;\n  <span class=\"hljs-attribute\">margin-right<\/span>: <span class=\"hljs-number\">10px<\/span>;\n}\n<span class=\"hljs-selector-class\">.list-enter-active<\/span>, <span class=\"hljs-selector-class\">.list-leave-active<\/span> {\n  <span class=\"hljs-attribute\">transition<\/span>: all <span class=\"hljs-number\">1s<\/span>;\n}\n<span class=\"hljs-selector-class\">.list-enter<\/span>, <span class=\"hljs-selector-class\">.list-leave-active<\/span> {\n  <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">0<\/span>;\n  <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(30px);\n}\n<\/code><\/pre>\n<p>\u00a0<\/p>\n<div id=\"list-demo\" class=\"demo\"><button>Add<\/button>\u00a0<button>Remove<\/button>\n<p><span class=\"list-item\">1<\/span><span class=\"list-item\">2<\/span><span class=\"list-item\">3<\/span><span class=\"list-item\">4<\/span><span class=\"list-item\">5<\/span><span class=\"list-item\">6<\/span><span class=\"list-item\">7<\/span><span class=\"list-item\">8<\/span><span class=\"list-item\">9<\/span><\/p>\n<\/div>\n<p>\u00a0<\/p>\n<p>\u8fd9\u4e2a\u4f8b\u5b50\u6709\u4e2a\u95ee\u9898\uff0c\u5f53\u6dfb\u52a0\u548c\u79fb\u9664\u5143\u7d20\u7684\u65f6\u5019\uff0c\u5468\u56f4\u7684\u5143\u7d20\u4f1a\u77ac\u95f4\u79fb\u52a8\u5230\u4ed6\u4eec\u7684\u65b0\u5e03\u5c40\u7684\u4f4d\u7f6e\uff0c\u800c\u4e0d\u662f\u5e73\u6ed1\u7684\u8fc7\u6e21\uff0c\u6211\u4eec\u4e0b\u9762\u4f1a\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002 ### \u5217\u8868\u7684\u4f4d\u79fb\u8fc7\u6e21 &#8220; \u7ec4\u4ef6\u8fd8\u6709\u4e00\u4e2a\u7279\u6b8a\u4e4b\u5904\u3002\u4e0d\u4ec5\u53ef\u4ee5\u8fdb\u5165\u548c\u79bb\u5f00\u52a8\u753b\uff0c\u8fd8\u53ef\u4ee5\u6539\u53d8\u5b9a\u4f4d\u3002\u8981\u4f7f\u7528\u8fd9\u4e2a\u65b0\u529f\u80fd\u53ea\u9700\u4e86\u89e3\u65b0\u589e\u7684 ** `v-move` \u7279\u6027**\uff0c\u5b83\u4f1a\u5728\u5143\u7d20\u7684\u6539\u53d8\u5b9a\u4f4d\u7684\u8fc7\u7a0b\u4e2d\u5e94\u7528\u3002\u50cf\u4e4b\u524d\u7684\u7c7b\u540d\u4e00\u6837\uff0c\u53ef\u4ee5\u901a\u8fc7 `name` \u5c5e\u6027\u6765\u81ea\u5b9a\u4e49\u524d\u7f00\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7 `move-class` \u5c5e\u6027\u624b\u52a8\u8bbe\u7f6e\u3002 `v-move` \u5bf9\u4e8e\u8bbe\u7f6e\u8fc7\u6e21\u7684\u5207\u6362\u65f6\u673a\u548c\u8fc7\u6e21\u66f2\u7ebf\u975e\u5e38\u6709\u7528\uff0c\u4f60\u4f1a\u770b\u5230\u5982\u4e0b\u7684\u4f8b\u5b50\uff1a &#8220;` html<\/p>\n<p>\u00a0<\/p>\n<div id=\"flip-list-demo\" class=\"demo\"><button>Shuffle<\/button>\n<ul>\n<li>\u00a0<\/li>\n<li>\u00a0<\/li>\n<li>\u00a0<\/li>\n<li>\u00a0<\/li>\n<li>\u00a0<\/li>\n<li>\u00a0<\/li>\n<li>\u00a0<\/li>\n<li>\u00a0<\/li>\n<li>\u00a0<\/li>\n<\/ul>\n<\/div>\n<p>\u00a0<\/p>\n<pre><code>&lt;\/li&gt;\n<\/code><\/pre>\n<p>&lt;\/transition-group&gt; &lt;\/div&gt;<\/p>\n<pre><code>\n``` js\nnew Vue({\n  el: '#flip-list-demo',\n  data: {\n    items: [1,2,3,4,5,6,7,8,9]\n  },\n  methods: {\n    shuffle: function () {\n      this.items = _.shuffle(this.items)\n    }\n  }\n})\n<\/code><\/pre>\n<pre><code class=\"lang-css\"><span class=\"hljs-selector-class\">.flip-list-move<\/span> {\n  <span class=\"hljs-attribute\">transition<\/span>: transform <span class=\"hljs-number\">1s<\/span>;\n}\n<\/code><\/pre>\n<div id=\"flip-list-demo\" class=\"demo\"><button>Shuffle<\/button>\n<ul>\n<li>{{ item }}<\/li>\n<\/ul>\n<\/div>\n<p>\u8fd9\u4e2a\u770b\u8d77\u6765\u5f88\u795e\u5947\uff0c\u5185\u90e8\u7684\u5b9e\u73b0\uff0cVue \u4f7f\u7528\u4e86\u4e00\u4e2a\u53eb [FLIP](https:\/\/aerotwist.com\/blog\/flip-your-animations\/) \u7b80\u5355\u7684\u52a8\u753b\u961f\u5217 \u4f7f\u7528 transforms \u5c06\u5143\u7d20\u4ece\u4e4b\u524d\u7684\u4f4d\u7f6e\u5e73\u6ed1\u8fc7\u6e21\u65b0\u7684\u4f4d\u7f6e\u3002 \u6211\u4eec\u5c06\u4e4b\u524d\u5b9e\u73b0\u7684\u4f8b\u5b50\u548c\u8fd9\u4e2a\u6280\u672f\u7ed3\u5408\uff0c\u4f7f\u6211\u4eec\u5217\u8868\u7684\u4e00\u5207\u53d8\u52a8\u90fd\u4f1a\u6709\u52a8\u753b\u8fc7\u6e21\u3002 &#8220;` html<\/p>\n<p>\u00a0<\/p>\n<div id=\"list-complete-demo\" class=\"demo\"><button>Shuffle<\/button>\u00a0<button>Add<\/button>\u00a0<button>Remove<\/button>\n<p>\u00a0<\/p>\n<\/div>\n<p>\u00a0<\/p>\n<pre><code>&lt;\/span&gt;\n<\/code><\/pre>\n<p>&lt;\/transition-group&gt; &lt;\/div&gt;<\/p>\n<pre><code>\n``` js\nnew Vue({\n  el: '#list-complete-demo',\n  data: {\n    items: [1,2,3,4,5,6,7,8,9],\n    nextNum: 10\n  },\n  methods: {\n    randomIndex: function () {\n      return Math.floor(Math.random() * this.items.length)\n    },\n    add: function () {\n      this.items.splice(this.randomIndex(), 0, this.nextNum++)\n    },\n    remove: function () {\n      this.items.splice(this.randomIndex(), 1)\n    },\n    shuffle: function () {\n      this.items = _.shuffle(this.items)\n    }\n  }\n})\n<\/code><\/pre>\n<pre><code class=\"lang-css\"><span class=\"hljs-selector-class\">.list-complete-item<\/span> {\n  <span class=\"hljs-attribute\">transition<\/span>: all <span class=\"hljs-number\">1s<\/span>;\n  <span class=\"hljs-attribute\">display<\/span>: inline-block;\n  <span class=\"hljs-attribute\">margin-right<\/span>: <span class=\"hljs-number\">10px<\/span>;\n}\n<span class=\"hljs-selector-class\">.list-complete-enter<\/span>, <span class=\"hljs-selector-class\">.list-complete-leave-active<\/span> {\n  <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">0<\/span>;\n  <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(30px);\n}\n<span class=\"hljs-selector-class\">.list-complete-leave-active<\/span> {\n  <span class=\"hljs-attribute\">position<\/span>: absolute;\n}\n<\/code><\/pre>\n<div id=\"list-complete-demo\" class=\"demo\"><button>Shuffle<\/button>\u00a0<button>Add<\/button>\u00a0<button>Remove<\/button>\u00a0<span class=\"list-complete-item\">{{ item }}<\/span><\/div>\n<p class=\"tip\">\u9700\u8981\u6ce8\u610f\u7684\u662f\u4f7f\u7528 FLIP \u8fc7\u6e21\u7684\u5143\u7d20\u4e0d\u80fd\u8bbe\u7f6e\u4e3a `display: inline` \u3002\u4f5c\u4e3a\u66ff\u4ee3\u65b9\u6848\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u4e3a `display: inline-block` \u6216\u8005\u653e\u7f6e\u4e8e flex \u4e2d<\/p>\n<p>FLIP \u52a8\u753b\u4e0d\u4ec5\u53ef\u4ee5\u5b9e\u73b0\u5355\u5217\u8fc7\u6e21\uff0c\u591a\u7ef4\u7f51\u683c\u7684\u8fc7\u6e21\u4e5f\u540c\u6837[\u7b80\u5355](https:\/\/jsfiddle.net\/chrisvfritz\/sLrhk1bc\/):<\/p>\n<div id=\"sudoku-demo\" class=\"demo\"><strong>Lazy Sudoku<\/strong>\n<p>Keep hitting the shuffle button until you win.<\/p>\n<button>Shuffle<\/button>\n<div class=\"sudoku-container\">\n<div class=\"cell\">\u00a0<\/div>\n<div class=\"cell\">\u00a0<\/div>\n<\/div>\n<\/div>\n<p>### \u5217\u8868\u7684\u6e10\u8fdb\u8fc7\u6e21 \u901a\u8fc7 data \u5c5e\u6027\u4e0e JavaScript \u901a\u4fe1 \uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u5217\u8868\u7684\u6e10\u8fdb\u8fc7\u6e21\uff1a &#8220;` html<\/p>\n<p>\u00a0<\/p>\n<div id=\"staggered-list-demo\"><input type=\"text\" \/>\u00a0&lt;li v-for=&#8221;(item, index) in computedList&#8221; v-bind:key=&#8221;item.msg&#8221; v-bind:data-index=&#8221;index&#8221;<\/div>\n<p>\u00a0<\/p>\n<pre><code>&gt;&lt;\/li&gt;\n<\/code><\/pre>\n<p>&lt;\/transition-group&gt; &lt;\/div&gt;<\/p>\n<pre><code>\n``` js\nnew Vue({\n  el: '#staggered-list-demo',\n  data: {\n    query: '',\n    list: [\n      { msg: 'Bruce Lee' },\n      { msg: 'Jackie Chan' },\n      { msg: 'Chuck Norris' },\n      { msg: 'Jet Li' },\n      { msg: 'Kung Fury' }\n    ]\n  },\n  computed: {\n    computedList: function () {\n      var vm = this\n      return this.list.filter(function (item) {\n        return item.msg.toLowerCase().indexOf(vm.query.toLowerCase()) !== -1\n      })\n    }\n  },\n  methods: {\n    beforeEnter: function (el) {\n      el.style.opacity = 0\n      el.style.height = 0\n    },\n    enter: function (el, done) {\n      var delay = el.dataset.index * 150\n      setTimeout(function () {\n        Velocity(\n          el,\n          { opacity: 1, height: '1.6em' },\n          { complete: done }\n        )\n      }, delay)\n    },\n    leave: function (el, done) {\n      var delay = el.dataset.index * 150\n      setTimeout(function () {\n        Velocity(\n          el,\n          { opacity: 0, height: 0 },\n          { complete: done }\n        )\n      }, delay)\n    }\n  }\n})\n<\/code><\/pre>\n<div id=\"example-5\" class=\"demo\"><input type=\"text\" \/>\n<ul>\n<li data-index=\"0\">Bruce Lee<\/li>\n<li data-index=\"1\">Jackie Chan<\/li>\n<li data-index=\"2\">Chuck Norris<\/li>\n<li data-index=\"3\">Jet Li<\/li>\n<li data-index=\"4\">Kung Fury<\/li>\n<\/ul>\n<\/div>\n<h2 id=\"\u53ef\u590d\u7528\u7684\u8fc7\u6e21\">\u53ef\u590d\u7528\u7684\u8fc7\u6e21<\/h2>\n<p>\u8fc7\u6e21\u53ef\u4ee5\u901a\u8fc7 Vue \u7684\u7ec4\u4ef6\u7cfb\u7edf\u5b9e\u73b0\u590d\u7528\u3002\u8981\u521b\u5efa\u4e00\u4e2a\u53ef\u590d\u7528\u8fc7\u6e21\u7ec4\u4ef6\uff0c\u4f60\u9700\u8981\u505a\u7684\u5c31\u662f\u5c06\u00a0<code>&lt;transition&gt;<\/code>\u00a0\u6216\u8005\u00a0<code>&lt;transition-group&gt;<\/code>\u00a0\u4f5c\u4e3a\u6839\u7ec4\u4ef6\uff0c\u7136\u540e\u5c06\u4efb\u4f55\u5b50\u7ec4\u4ef6\u653e\u7f6e\u5728\u5176\u4e2d\u5c31\u53ef\u4ee5\u4e86\u3002<\/p>\n<p>\u4f7f\u7528 template \u7684\u7b80\u5355\u4f8b\u5b50\uff1a<\/p>\n<pre><code class=\"lang-js\">Vue.component(<span class=\"hljs-string\">'my-special-transition'<\/span>, {\n  template: <span class=\"hljs-string\">'\\\n    &lt;transition\\\n      name=\"very-special-transition\"\\\n      mode=\"out-in\"\\\n      v-on:before-enter=\"beforeEnter\"\\\n      v-on:after-enter=\"afterEnter\"\\\n    &gt;\\\n      &lt;slot&gt;&lt;\/slot&gt;\\\n    &lt;\/transition&gt;\\\n  '<\/span>,\n  methods: {\n    beforeEnter: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">el<\/span>) <\/span>{\n      <span class=\"hljs-comment\">\/\/ ...<\/span>\n    },\n    afterEnter: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">el<\/span>) <\/span>{\n      <span class=\"hljs-comment\">\/\/ ...<\/span>\n    }\n  }\n})\n<\/code><\/pre>\n<p>\u51fd\u6570\u7ec4\u4ef6\u66f4\u9002\u5408\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff1a<\/p>\n<pre><code class=\"lang-js\">Vue.component(<span class=\"hljs-string\">'my-special-transition'<\/span>, {\n  functional: <span class=\"hljs-literal\">true<\/span>,\n  render: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">createElement, context<\/span>) <\/span>{\n    <span class=\"hljs-keyword\">var<\/span> data = {\n      props: {\n        name: <span class=\"hljs-string\">'very-special-transition'<\/span>\n        mode: <span class=\"hljs-string\">'out-in'<\/span>\n      },\n      on: {\n        beforeEnter: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">el<\/span>) <\/span>{\n          <span class=\"hljs-comment\">\/\/ ...<\/span>\n        },\n        afterEnter: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">el<\/span>) <\/span>{\n          <span class=\"hljs-comment\">\/\/ ...<\/span>\n        }\n      }\n    }\n    <span class=\"hljs-keyword\">return<\/span> createElement(<span class=\"hljs-string\">'transition'<\/span>, data, context.children)\n  }\n})\n<\/code><\/pre>\n<h2 id=\"\u52a8\u6001\u8fc7\u6e21\">\u52a8\u6001\u8fc7\u6e21<\/h2>\n<p>\u5728 Vue \u4e2d\u5373\u4f7f\u662f\u8fc7\u6e21\u4e5f\u662f\u6570\u636e\u9a71\u52a8\u7684\uff01\u52a8\u6001\u8fc7\u6e21\u6700\u57fa\u672c\u7684\u4f8b\u5b50\u662f\u901a\u8fc7\u00a0<code>name<\/code>\u00a0\u7279\u6027\u6765\u7ed1\u5b9a\u52a8\u6001\u503c\u3002<\/p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">transition<\/span> <span class=\"hljs-attr\">v-bind:name<\/span>=<span class=\"hljs-string\">\"transitionName\"<\/span>&gt;<\/span>\n  <span class=\"hljs-comment\">&lt;!-- ... --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">transition<\/span>&gt;<\/span>\n<\/code><\/pre>\n<p>\u5f53\u4f60\u60f3\u7528 Vue \u7684\u8fc7\u6e21\u7cfb\u7edf\u6765\u5b9a\u4e49\u7684 CSS \u8fc7\u6e21\/\u52a8\u753b \u5728\u4e0d\u540c\u8fc7\u6e21\u95f4\u5207\u6362\u4f1a\u975e\u5e38\u6709\u7528\u3002<\/p>\n<p>\u6240\u6709\u7684\u8fc7\u6e21\u7279\u6027\u90fd\u662f\u52a8\u6001\u7ed1\u5b9a\u3002\u5b83\u4e0d\u4ec5\u662f\u7b80\u5355\u7684\u7279\u6027\uff0c\u901a\u8fc7\u4e8b\u4ef6\u7684\u94a9\u5b50\u51fd\u6570\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5728\u83b7\u53d6\u5230\u76f8\u5e94\u4e0a\u4e0b\u6587\u6570\u636e\u3002\u8fd9\u610f\u5473\u7740\uff0c\u53ef\u4ee5\u6839\u636e\u7ec4\u4ef6\u7684\u72b6\u6001\u901a\u8fc7 JavaScript \u8fc7\u6e21\u8bbe\u7f6e\u4e0d\u540c\u7684\u8fc7\u6e21\u6548\u679c\u3002<\/p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/velocity\/1.2.3\/velocity.min.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"dynamic-fade-demo\"<\/span>&gt;<\/span>\n  Fade In: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"range\"<\/span> <span class=\"hljs-attr\">v-model<\/span>=<span class=\"hljs-string\">\"fadeInDuration\"<\/span> <span class=\"hljs-attr\">min<\/span>=<span class=\"hljs-string\">\"0\"<\/span> <span class=\"hljs-attr\">v-bind:max<\/span>=<span class=\"hljs-string\">\"maxFadeDuration\"<\/span>&gt;<\/span>\n  Fade Out: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"range\"<\/span> <span class=\"hljs-attr\">v-model<\/span>=<span class=\"hljs-string\">\"fadeOutDuration\"<\/span> <span class=\"hljs-attr\">min<\/span>=<span class=\"hljs-string\">\"0\"<\/span> <span class=\"hljs-attr\">v-bind:max<\/span>=<span class=\"hljs-string\">\"maxFadeDuration\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">transition<\/span>\n    <span class=\"hljs-attr\">v-bind:css<\/span>=<span class=\"hljs-string\">\"false\"<\/span>\n    <span class=\"hljs-attr\">v-on:before-enter<\/span>=<span class=\"hljs-string\">\"beforeEnter\"<\/span>\n    <span class=\"hljs-attr\">v-on:enter<\/span>=<span class=\"hljs-string\">\"enter\"<\/span>\n    <span class=\"hljs-attr\">v-on:leave<\/span>=<span class=\"hljs-string\">\"leave\"<\/span>\n  &gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">v-if<\/span>=<span class=\"hljs-string\">\"show\"<\/span>&gt;<\/span>hello<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">transition<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">v-on:click<\/span>=<span class=\"hljs-string\">\"stop = true\"<\/span>&gt;<\/span>Stop it!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/code><\/pre>\n<pre><code class=\"lang-js\"><span class=\"hljs-keyword\">new<\/span> Vue({\n  el: <span class=\"hljs-string\">'#dynamic-fade-demo'<\/span>,\n  data: {\n    show: <span class=\"hljs-literal\">true<\/span>,\n    fadeInDuration: <span class=\"hljs-number\">1000<\/span>,\n    fadeOutDuration: <span class=\"hljs-number\">1000<\/span>,\n    maxFadeDuration: <span class=\"hljs-number\">1500<\/span>,\n    stop: <span class=\"hljs-literal\">false<\/span>\n  },\n  mounted: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> () <\/span>{\n    <span class=\"hljs-keyword\">this<\/span>.show = <span class=\"hljs-literal\">false<\/span>\n  },\n  methods: {\n    beforeEnter: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">el<\/span>) <\/span>{\n      el.style.opacity = <span class=\"hljs-number\">0<\/span>\n    },\n    enter: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">el, done<\/span>) <\/span>{\n      <span class=\"hljs-keyword\">var<\/span> vm = <span class=\"hljs-keyword\">this<\/span>\n      Velocity(el,\n        { opacity: <span class=\"hljs-number\">1<\/span> },\n        {\n          duration: <span class=\"hljs-keyword\">this<\/span>.fadeInDuration,\n          complete: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> () <\/span>{\n            done()\n            <span class=\"hljs-keyword\">if<\/span> (!vm.stop) vm.show = <span class=\"hljs-literal\">false<\/span>\n          }\n        }\n      )\n    },\n    leave: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">el, done<\/span>) <\/span>{\n      <span class=\"hljs-keyword\">var<\/span> vm = <span class=\"hljs-keyword\">this<\/span>\n      Velocity(el,\n        { opacity: <span class=\"hljs-number\">0<\/span> },\n        {\n          duration: <span class=\"hljs-keyword\">this<\/span>.fadeOutDuration,\n          complete: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> () <\/span>{\n            done()\n            vm.show = <span class=\"hljs-literal\">true<\/span>\n          }\n        }\n      )\n    }\n  }\n})\n<\/code><\/pre>\n<div id=\"dynamic-fade-demo\" class=\"demo\">Fade In:\u00a0<input max=\"1500\" min=\"0\" type=\"range\" \/>\u00a0Fade Out:\u00a0<input max=\"1500\" min=\"0\" type=\"range\" \/>\n<p>hello<\/p>\n<button>Stop it!<\/button><\/div>\n<p>\u6700\u540e\uff0c\u521b\u5efa\u52a8\u6001\u8fc7\u6e21\u7684\u6700\u7ec8\u65b9\u6848\u662f\u7ec4\u4ef6\u901a\u8fc7\u63a5\u53d7 props \u6765\u52a8\u6001\u4fee\u6539\u4e4b\u524d\u7684\u8fc7\u6e21\u3002\u4e00\u53e5\u8001\u8bdd\uff0c\u552f\u4e00\u7684\u9650\u5236\u662f\u4f60\u7684\u60f3\u8c61\u529b\u3002<\/p>","protected":false},"excerpt":{"rendered":"<p>\u6982\u8ff0 Vue \u5728\u63d2\u5165\u3001\u66f4\u65b0\u6216\u8005\u79fb\u9664 DOM \u65f6\uff0c\u63d0\u4f9b\u591a\u79cd\u4e0d\u540c\u65b9\u5f0f\u7684\u5e94\u7528\u8fc7\u6e21\u6548\u679c\u3002 \u5305\u62ec\u4ee5\u4e0b\u5de5\u5177\uff1a \u5728 CSS &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/posts\/61"}],"collection":[{"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/comments?post=61"}],"version-history":[{"count":1,"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/posts\/61\/revisions"}],"predecessor-version":[{"id":62,"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/posts\/61\/revisions\/62"}],"wp:attachment":[{"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/media?parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/categories?post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.33weixin.com\/index\/index.php\/wp-json\/wp\/v2\/tags?post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}