ìŽê²ì ëŒìŽëž 묞ìì ëë€. ë§ì§ë§ ì ë°ìŽíž: 2.0.0-rc.2 êž°ì€ 2016ë 8ì 17ìŒ
ìŒë° ì°žê³ ì¬í
ë§ì§ë§ì ëª ê°ì§ ì ê·žë ìŽë í ìŽ ììµëë€.
í
í늿 íìë ë ìŽì DOMì ìì¡Žíì§ ììµëë€(ì€ì DOMì í
í늿ìŒë¡ ì¬ì©íì§ ìë í). 묞ììŽ í
í늿( <script type="text/x-template">
, ìžëŒìž JavaScript 묞ììŽ ëë ëšìŒ íìŒ êµ¬ì± ìì륌 íµíŽ 컎íìŒëë í) ), ë ìŽì 1.x ì el
ìµì
ì ì¬ì©íì¬ êž°ì¡Ž ìœí
ìž ë¥Œ í
í늿ìŒë¡ ì¬ì©íì¬ ììì íì¬íë 겜ì°ìë ìŽë¬í ì í ì¬íìŽ ì ì©ë©ëë€.
컎íìŒë¬(í í늿 묞ììŽì ë ë íšìë¡ ë³ííë ë¶ë¶)ì ë°íìì ìŽì ë¶ëŠ¬í ì ììµëë€. ë ê°ì§ ë€ë¥ž ë¹ëê° ììµëë€.
vueify
ëë vue-loader
ê° ì€íëë ëì 컎íìŒ ëšê³(Browserify ëë Webpack í¬íš)륌 ì¬ì©í ê°ë¥ì±ìŽ ëêž° ë묞ì
ëë€. í
í늿 ì¬ì 컎íìŒ.[x] Vue.config.silent
v-on
ëí ì¬ì©ì ì§ì í€ ë³ì¹ì 구ì±í©ëë€.Vue.config.unsafeDelimiters ë ìŽì ì¬ì©ëì§ ìì, v-html ì¬ì©
[x] Vue.extend
el
ìì ë°ìŽí° ìžë±ì€ë¥Œ ì€ì íê³ ì¡ìžì€í©ëë€.[x] ìê³
[x] ì
ë ìŽì ì¬ì©ëì§ ìë êµì²Ž , ìŽì êµ¬ì± ìììë ì íí íëì ë£šíž ììê° ììŽìŒ í©ëë€ .
[x] ìì± ì ì ìŽêž°í
detached ë ìŽì ì¬ì©ëì§ ìì, ìì ëìŒ
[x] ì§ì묞
ë ìŽì ì¬ì©ëì§ ìë elementDirectives
[x] ë¶ëªš
ìŽë²€ížë ë ìŽì ìŽë²€íž ì ííêž° ë묞ì, ì¬ì©ëì§ ìë
[x] vm.$data
vm.$log ë ìŽì ì¬ì©ëì§ ìì, devtools ì¬ì©
[x] vm.$on
vm.$broadcast ë ìŽì ì¬ì©ëì§ ìì, ìì ëìŒ
[x] vm.$nextTick
vm.$remove ë ìŽì ì¬ì©ëì§ ìì
[x] VM.$ë§ìŽíž
[x] vm.$destroy
[x] v-í ì€íž
{{{ }}}
ìêž°ë ë ìŽì ì¬ì©ëì§ ììµëë€.(value, index) in arr
, (value, key, index) in obj
$index
ë° $key
Vue.config.keyCodes
ëì Vue.directive('on').keyCodes
)ref
ì ê°ì í¹ì ìì±ìŒ ë¿ì
ëë€.v-el ë ìŽì ì¬ì©ëì§ ìì(refì ë³í©ëš)
[x] <component>
<transition>
<transition-group>
<keep-alive>
<slot>
ë¶ë¶ì ìŒë¡ ì¬ì©ëì§ ìì
[x] í€
[x] ì¬ë¡¯
[x] ë ëë§í 묞ììŽ
v-for
ë°ë³µ 구묞 ë³ê²œ$index
ë° $key
ì€ëš
ìŽ ë ê°ì§ 몚ë ë ëª ìì ìž ëª ëª ë ìžë±ì€ì í€ë¥Œ ìíŽ ë ìŽì ì¬ì©ëì§ ììµëë€. ìŽ êµ¬ë¬žì ìœê° ë§ì ì ìŽë©° ì€ì²© 룚íì ì íìŽ ììµëë€. 볎ëì€ë¡, ìë¡ ìš ì¬ëë€ìŽ ë°°ìž ì ìë 구묞ì í¬ìžížê° ë ê° ë ì ìµëë€.
value in arr
(value, index) in arr
(ìë°ì€í¬ëŠœížì forEach
ë° map
ì ë ìŒêŽì±ì ê°ëë¡ ìžì ìì ì í)value in obj
(value, key) in obj
(ìžì ìì ì í, ë¶ë¶ì ìŒë¡ lodashì ê°ì ë§ì ê³µíµ ê°ì²Ž ë°ë³µìì ë ìŒêŽì±ìŽ ìì)(value, key, index) in obj
(ìŽì í
ìŽëž ì€ížëŒìŽí곌 ê°ì ìê°ì 목ì ì ìíŽ ê°ì²Ž ë°ë³µìì ìžë±ì€ë¥Œ ì¬ì©í ì ìì)ìŒë°ì ìŒë¡ 2.0ìì ì§ì묞ì ì± ì ë²ìê° í¬ê² ì¶ìëììµëë€. ìŽì ì ìì€ ì§ì DOM ì¡°ìì ì ì©íë ë°ë§ ì¬ì©ë©ëë€. ëë¶ë¶ì ê²œì° ì»Ží¬ëížë¥Œ Ʞ볞 ìœë ì¬ì¬ì© ì¶ìíë¡ ì¬ì©íë ê²ì ì ížíŽìŒ í©ëë€.
ì§ì묞ìë ë ìŽì ìžì€íŽì€ê° ììµëë€. ìŠ, ì§ì묞 íí¬ ëŽë¶ì ë ìŽì this
ê° ìê³ bind
, update
ë° unbind
ìŽì 몚ë ê²ì ìžìë¡ ë°ìµëë€.
binding
ê°ì²Žë ë³ê²œí ì ììŒë©° binding.value
ì€ì íŽë íšê³Œê° ììŒë©° ì¶ê°ë ìì±ìŽ ì ì§ëì§ ììµëë€. ë€ììŽ ì ëì ìŒë¡ íìí ê²œì° el
ì ëí ì§ì묞 ìí륌 ì ì§í ì ììµëë€.
<div v-example:arg.modifier="a.b"></div>
// example directive
export default {
bind (el, binding, vnode) {
// the binding object exposes value, oldValue, expression, arg and modifiers.
binding.expression // "a.b"
binding.arg // "arg"
binding.modifiers // { modifier: true }
// the context Vue instance can be accessed as vnode.context.
},
// update has a few changes, see below
update (el, binding, vnode, oldVnode) { ... },
// componentUpdated is a new hook that is called AFTER the entire component
// has completed the current update cycle. This means all the DOM would
// be in updated state when this hook is called. Also, this hook is always
// called regardless of whether this directive's value has changed or not.
componentUpdated (el, binding, vnode, oldVNode) { ... },
unbind (el, binding, vnode) { ... }
}
ê°ìë§ êŽì¬ìŽ ìë ê²œì° êµ¬ì¡° ì 거륌 ì¬ì©í ì ììµëë€.
export default {
bind (el, { value }) {
// ...
}
}
ëí update
íí¬ìë ëª ê°ì§ ë³ê²œ ì¬íìŽ ììµëë€.
bind
ìŽíìë ë ìŽì ìëìŒë¡ ížì¶ëì§ ììµëë€.binding.value === binding.oldValue
륌 ë¹êµíì¬ ë¶íìí ì
ë°ìŽížë¥Œ 걎ëëž ì ìì§ë§ íì ì
ë°ìŽížë¥Œ ì ì©íë €ë 겜ì°ë ììµëë€.elementDirective
, ì§ì묞 맀ê°ë³ì ë° acceptStatement
, deep
ë±ê³Œ ê°ì ì§ì묞 ìµì
ì 몚ë ë ìŽì ì¬ì©ëì§ ììµëë€.
Vue 2.0ììë íí° ìì€í ì ëª ê°ì§ ë³ê²œ ì¬íìŽ ììµëë€.
{{}}
íê·ž) ëŽììë§ ì¬ì©í ì ììµëë€. 곌거ìë v-model
, v-on
ë±ê³Œ ê°ì ì§ì묞곌 íšê» íí°ë¥Œ ì¬ì©íë ê²ìŽ ížëŠ¬íšë³Žë€ ë ë³µì¡íë€ë ê²ì ë°ê²¬íìŒë©° v-for
ì ëí ëª©ë¡ íí°ë§ì ê²œì° ë ì ì í©ëë€. íŽë¹ ë
ŒëŠ¬ë¥Œ ê³ì°ë ìì±ìŒë¡ JavaScriptë¡ ìŽëí©ëë€.
{{ date | formatDate('YY-MM-DD') }}
ì í CSS íŽëì€ ë³ê²œ ì¬í:
Always-on v-transition
íŽëì€ë ë ìŽì ì¶ê°ëì§ ììŒë©° Vueë ìŽì Angular ë° React CSSTransitionGroup곌 ëìŒí íŽëì€ë¥Œ ì¬ì©í©ëë€.
v-enter
: ììê° ìœì
ëêž° ì ì ì ì©ëê³ 1í± íì ì ê±°ë©ëë€. (ì
ë ¥ì ìí ìì ìí)v-enter-active
: ììê° ìœì
ëêž° ì ì ì ì©ëê³ ì í/ì ëë©ìŽì
ìŽ ìë£ëë©Ž ì ê±°ë©ëë€. (íì±í + ìí°ë¥Œ ìí ì¢
ë£ ìí)v-leave
: íŽì¬ ì í ë°ìì ë°ë¡ ì ì©, 1í± í ìì (íŽì¬ ìì ìí)v-leave-active
: ëê°êž° ì íìŽ ížëŠ¬ê±°ëë©Ž ë°ë¡ ì ì©ëê³ ì í/ì ëë©ìŽì
ìŽ ìë£ëë©Ž ì ê±°ë©ëë€. (íì± + íŽê° ì¢
ë£ ìí)v-enter-active
ë° v-leave-active
ë ì§ì
/íŽì¥ ì íì ëíŽ ë€ë¥ž ìŽì§ 곡ì ì ì§ì í ì ìë êž°ë¥ì ì ê³µí©ëë€. ëë¶ë¶ì ê²œì° ì
ê·žë ìŽëë ëšìí íì¬ v-leave
륌 v-leave-active
ë°êŸžë ê²ì ì믞í©ëë€. (CSS ì ëë©ìŽì
ì ê²œì° v-enter-active
+ v-leave-active
)
<transition>
êµ¬ì± ìì
ìŽì 몚ë ëšìŒ ìì ì í íšê³Œë ëì ìì/êµ¬ì± ìì륌 <transition>
ëŽì¥ êµ¬ì± ììë¡ ëííì¬ ì ì©ë©ëë€. ìŽê²ì ì¶ì êµ¬ì± ììì
ëë€. ìŠ, ì¶ê° DOM ìì륌 ë ëë§íì§ ììŒë©° ê²ì¬ë êµ¬ì± ìì ê³ìžµ 구조ì íìëì§ ììµëë€. ëšìí ëŽë¶ì ëíë ìœí
ìž ì ì í ëìì ì ì©í©ëë€.
ê°ì¥ ê°ëší ì¬ì© ì:
<transition>
<div v-if="ok">toggled content</div>
</transition>
êµ¬ì± ììë ìŽì ì í ì ì ìµì ì ì§ì 맀íëë ì¬ë¬ ìí ë° ìŽë²€ížë¥Œ ì ìí©ëë€.
ìí
ì í CSS íŽëì€ ìŽëŠì ìëìŒë¡ ìì±íë ë° ì¬ì©ë©ëë€. ì륌 ë€ìŽ name: 'fade'
ë .fade-enter
, .fade-enter-active
ë±ìŒë¡ ìë íì¥ë©ëë€. Ʞ볞ê°ì "v"
ì
ëë€.
ìŽêž° ë ëë§ì ì íì ì ì©í ì§ ì¬ë¶ì
ëë€. Ʞ볞ê°ì false
ì
ëë€.
CSS ì í íŽëì€ë¥Œ ì ì©í ì§ ì¬ë¶ì
ëë€. Ʞ볞ê°ì true
ì
ëë€. false
ë¡ ì€ì íë©Ž êµ¬ì± ìì ìŽë²€ížë¥Œ íµíŽ ë±ë¡ë JavaScript íí¬ë§ ížëŠ¬ê±°í©ëë€.
ì í ì¢
ë£ íìŽë°ì ê²°ì íêž° ìíŽ ëêž°í ì í ìŽë²€ížì ì íì ì§ì í©ëë€. ì¬ì© ê°ë¥í ê°ì "transition"
ë° "animation"
ì
ëë€. Ʞ볞ì ìŒë¡ ì§ì ìê°ìŽ ë ꞎ ì íì ìëìŒë¡ ê°ì§í©ëë€.
íŽì¥/ì§ì
ì íì íìŽë° ìì륌 ì ìŽí©ëë€. ì¬ì© ê°ë¥í 몚ëë "out-in"
ë° "in-out"
. Ʞ볞ê°ì ëìì
ëë€.
ì í CSS íŽëì€ë¥Œ ê°ë³ì ìŒë¡ 구ì±í©ëë€.
ëì 구ì±ììì ì íì ì ì©íë ì:
<transition name="fade" mode="out-in" appear>
<component :is="view"></component>
</transition>
ìŽë²€íž
1.x APIìì ì¬ì©í ì ìë JavaScript íí¬ì íŽë¹í©ëë€.
ìì:
<transition @after-enter="transitionComplete">
<div v-show="ok">toggled content</div>
</transition>
ì§ì
ì íìŽ ìë£ëë©Ž ì íë DOM ìì륌 ìžìë¡ ì¬ì©íì¬ êµ¬ì± ììì transitionComplete
ë©ìëê° ížì¶ë©ëë€.
ëª ê°ì§ ì°žê³ ì¬í:
leave-cancelled
ì(ë) ë ìŽì ìœì
/ì ê±°ì ì¬ì©í ì ììµëë€. íŽê° ì íìŽ ììëë©Ž ì·šìí ì ììµëë€. ê·žë¬ë v-show
ì íìë ì¬ì í ì¬ì©í ì ììµëë€.enter
ë° leave
íí¬ì ê²œì° 1.0곌 ì ì¬íê² ë ë²ì§ž ìžìë¡ cb
ê° ììŒë©Ž ì¬ì©ìê° ì í ì¢
ë£ íìŽë°ì ëª
ìì ìŒë¡ ì ìŽíꞰ륌 ìíë€ë ê²ì ëíë
ëë€.<transition-group>
êµ¬ì± ìì
ìŽì 몚ë ë€ì€ ìì ì í íšê³Œë <transition-group>
ëŽì¥ êµ¬ì± ììë¡ ìì륌 ëííì¬ ì ì©ë©ëë€. <transition>
ì ëìŒí ìí곌 ìŽë²€ížë¥Œ ë
žì¶í©ëë€. ì°šìŽì ì ë€ì곌 ê°ìµëë€.
<transition>
ì ë¬ëŠ¬ <transition-group>
ë ì€ì DOM ìì륌 ë ëë§í©ëë€. Ʞ볞ì ìŒë¡ <span>
륌 ë ëë§íë©° tag
ìíì íµíŽ ìŽë€ ììê° ë ëë§ëìŽìŒ íëì§ êµ¬ì±í ì ììµëë€. is
ìì±ê³Œ íšê» ì¬ì©í ìë ììµëë€(ì: <ul is="transition-group">
.<transition-group>
ë mode
ìíì ì§ìíì§ ììµëë€.<transition-group>
몚ë ììì ê³ ì í í€ê° ììŽìŒ í©ëë€.ìì:
<transition-group tag="ul" name="slide">
<li v-for="item in items" :key="item.id">
{{ item.text }}
</li>
</transition-group>
ìŽë ì í
<transition-group>
ë CSS ë³íì íµí ìŽë ì í ì ì§ìí©ëë€. ì
ë°ìŽíž í íë©Žìì ìë
ì ìì¹ê° ë³ê²œëë©Ž ìì§ìŽë CSS íŽëì€ê° ì ì©ë©ëë€( name
ìíìì ìë ìì±ëê±°ë moveClass
ìíìŒë¡ 구ì±ëš). ìì§ìŽë íŽëì€ê° ì ì©ë ë CSS transform
ìì±ìŽ "ì í ê°ë¥"ìŽë©Ž ììë FLIP êž°ì ì ì¬ì©íì¬ ëììŒë¡ ë¶ëëœê² ì ëë©ìŽì
ë©ëë€.
ì¬êž°ìì ëŒìŽëž ë°ëªšë¥Œ íìž íìžì.
ì¬ì¬ì© ê°ë¥í ì í ìì±
ìŽì ì íìŽ êµ¬ì± ìì륌 íµíŽ ì ì©ëë¯ë¡ ë ìŽì ìì° ì íìŒë¡ ê°ì£Œëì§ ììŒë¯ë¡ ì ì Vue.transition()
ë©ìëì transition
ìµì
ì 몚ë ë ìŽì ì¬ì©ëì§ ììµëë€. êµ¬ì± ìì ìí ë° ìŽë²€ížë¥Œ ì¬ì©íì¬ ì í ìžëŒìžì 구ì±í ì ììµëë€. ê·žë¬ë ìŽì ì¬ì¬ì© ê°ë¥í ì í íšê³Œ, í¹í ì¬ì©ì ì§ì JavaScript íí¬ê° ìë ì í íšê³Œë¥Œ ë§ëë ë°©ë²ì 묎ìì
ëê¹? ëµì ê³ ì í ì í êµ¬ì± ìì륌 ë§ëë ê²ì
ëë€(í¹í êž°ë¥ êµ¬ì± ììë¡ ì í©íš).
Vue.component('fade', {
functional: true,
render (createElement, { children }) {
const data = {
props: {
name: 'fade'
},
on: {
beforeEnter () { /* ... */ }, // <-- Note hooks use camelCase in JavaScript (same as 1.x)
afterEnter () { /* ... */ }
}
}
return createElement('transition', data, children)
}
})
ê·žë° ë€ì ë€ì곌 ê°ìŽ ì¬ì©í ì ììµëë€.
<fade>
<div v-if="ok">toggled content</div>
</fade>
lazy
ë° number
맀ê°ë³ìë ìŽì ìì ìì
ëë€.
<input v-model.lazy="text">
.trim
- ìŽëŠìì ì ì ìë¯ìŽ ì
ë ¥ì ìëŠ
ëë€.debounce
맀ê°ë³ìë ë ìŽì ì¬ì©ëì§ ììµëë€. (íëšì ì
ê·žë ìŽë í ì°žì¡°)v-model
ë ë ìŽì ìŽêž° ìžëŒìž value
ì 겜 ì°ì§ ììµëë€. íì Vue ìžì€íŽì€ ë°ìŽí°ë¥Œ ì§ì€ì ìì€ë¡ ì·šêží©ëë€. ìŽë ë€ììŽ 2 ëì 1 ê°ìŒë¡ ë ëë§ëšì ì믞í©ëë€.
data: {
val: 1
}
<input v-model="val" value="2">
êž°ì¡Ž ìœí
ìž ê° ìë <textarea>
ë§ì°¬ê°ì§ì
ëë€. ë°ëŒì ëì :
<textarea v-model="val">hello world</textarea>
íë€:
data () {
return {
val: 'hello world'
}
}
<textarea v-model="val"></textarea>
죌ì ììŽëìŽë JS ìž¡ìŽ í íëŠ¿ìŽ ìëëŒ ì§ì€ì ìì€ë¡ ê°ì£ŒëìŽìŒ íë€ë ê²ì ëë€.
v-model
v-for
ë°ë³µëë Ʞ볞 ê°ì ì¬ì©í ë v-model
ê° ë ìŽì ìëíì§ ììµëë€.
<input v-for="str in strings" v-model="str">
ìŽê²ì JavaScriptìì ë€ì곌 ëìŒíêž° ë묞ì ìëíì§ ììµëë€.
strings.map(function (str) {
return createElement('input', ...)
})
볎ìë€ìíŒ str
륌 iterator íšìì ë€ë¥ž ê°ìŒë¡ ì€ì íë©Ž íšì ë²ìì ì§ì ë³ììŒ ë¿ìŽë¯ë¡ ì묎 ìì
ë ìííì§ ììµëë€. ëì v-model
ê° ê°ì²Žì íë륌 ì
ë°ìŽíží ì ìëë¡ ê°ì²Ž ë°°ìŽì ì¬ì©íŽìŒ í©ëë€.
<input v-for="obj in objects" v-model="obj.str">
.once
ë° .sync
ë ë ìŽì ì¬ì©ëì§ ììµëë€. ìŽì ìíì íì ëšë°©í¥ì
ëë€. ìì ë²ììì ë¶ìì©ì ìì±íë €ë©Ž êµ¬ì± ììê° ììì ë°ìžë©ì ìì¡Žíë ëì ëª
ìì ìŒë¡ ìŽë²€ížë¥Œ ëŽë³ŽëŽìŒ í©ëë€.
a
ì ìží ë€ì êµ¬ì± ìììì this.a = someOtherValue
륌 ì€ì í©ëë€. ìë¡ìŽ ë ëë§ ë©ì»€ëìŠìŒë¡ ìžíŽ ìì êµ¬ì± ììê° ë€ì ë ëë§ë ëë§ë€ íì êµ¬ì± ììì ë¡ì»¬ ë³ê²œ ì¬íì ë®ìŽìëë€. ìŒë°ì ìŒë¡ 2.0 ììë props륌 immutableë¡ ì²ëŠ¬ íŽìŒ í©ëë€. propì ë³ê²œíë ëë¶ë¶ì ì¬ì© ì¬ë¡ë ë°ìŽí° ìì±ìŽë ê³ì°ë ìì±ìŒë¡ ë첎ë ì ììµëë€.keep-alive
ë ë ìŽì í¹ì ìì±ìŽ ìëëë€. ìŽì <transition>
ì ì ì¬í ëíŒ êµ¬ì± ììì
ëë€.
<keep-alive>
<component :is="view"></component>
</keep-alive>
ìŽë ê² íë©Ž ì¬ë¬ ì¡°ê±Žë¶ ììì keep-alive
륌 ì¬ì©í ì ììµëë€(ììì ê²°êµ ëšìŒ ìììŒë¡ íê°ëìŽìŒ í©ëë€. 첫 ë²ì§ž ìì ìŽìžì ììì 묎ìëš).
<keep-alive>
<comp-a v-if="a > 1"></comp-a>
<comp-b v-else></comp-b>
</keep-alive>
<transition>
ì íšê» ì¬ì©íë ê²œì° ëŽë¶ì ì€ì²©íŽìŒ í©ëë€.
<transition>
<keep-alive>
<component :is="view"></component>
</keep-alive>
</transition>
<slot>
ê° ë ìŽì ì§ìëì§ ììµëë€. ì¬ë¡¯ìŽ ë ëë§ëë©Ž "ìì§"ëìŽ ëìŒí ë ëë§ ížëŠ¬ì ë€ë¥ž ìì¹ìì ë ëë§í ì ììµëë€.<slot>
ëŒë ìŽëŠì íµíŽ ìœì
ë ìœí
ìž ë ë ìŽì slot
ìì±ì ì ì§íì§ ììµëë€. ëíŒ ìì륌 ì¬ì©íì¬ ì€íìŒì ì§ì íê±°ë ê³ êž ì¬ì© ì¬ë¡ì ê²œì° ë ëë§ êž°ë¥ì ì¬ì©íì¬ íë¡ê·žëë° ë°©ììŒë¡ ìœì
ë ìœí
ìž ë¥Œ ìì í©ëë€.
v-ref
ë ìŽì ë ìŽì ì§ìë¬žìŽ ìëëë€. ìŽì key
ë° transition
ì ì ì¬í í¹ì ìì±ì
ëë€.
<!-- before -->
<comp v-ref:foo></comp>
<!-- after -->
<comp ref="foo"></comp>
ìŽì ëì ì°žì¡° ë°ìžë©ë ì§ìë©ëë€.
<comp :ref="dynamicRef"></comp>
vm.$els
ë° vm.$refs
ìŽ ë³í©ë©ëë€. ìŒë° ìììì ì¬ì©ë ë refë DOM ììê° ë ê²ìŽê³ 컎í¬ëížìì ì¬ì©ë ë ì°žì¡°ë 컎í¬ëíž ìžì€íŽì€ê° ë ê²ì
ëë€.vm.$refs
ë ë ëë§ íë¡ìžì€ ì첎 ì€ì ë±ë¡/ì
ë°ìŽížëêž° ë묞ì ë ìŽì ë°ìíì§ ììµëë€. ë°ìíìŒë¡ ë§ë€ë €ë©Ž 몚ë ë³ê²œì ëíŽ ì€ë³µ ë ëë§ìŽ íìí©ëë€.
ë°ë©Žì $refs
ì ì£Œë¡ JavaScriptì íë¡ê·žëë° ë°©ì ì¡ìžì€ë¥Œ ìíŽ ì€ê³ëììµëë€. ìžì€íŽì€ ì첎ì ìíì§ ìë ìí륌 ì°žì¡°íŽìŒ íêž° ë묞ì í
í늿ìì $refs
ì ìì¡Žíë ê²ì ê¶ì¥ëì§ ììµëë€.
track-by
ê° key
ë¡ ë첎ëììµëë€. ìŽì ìì± ë°ìžë©ì ëíŽ ëìŒí ê·ì¹ì ë°ëŠ
ëë€. v-bind:
ëë :
ì ëì¬ê° ììŒë©Ž 늬í°ëŽ 묞ììŽ ë¡ ì²ëŠ¬ë©ëë€. ëë¶ë¶ì ê²œì° ë¬žììŽ í€ ëì ì 첎 ííììŽ íìí ëì ë°ìžë©ì ì¬ì©íë €ê³ í©ëë€. ì륌 ë€ìŽ:
<!-- 1.x -->
<div v-for="item in items" track-by="id">
<!-- 2.0 -->
<div v-for="item in items" :key="item.id">
ìì± ëŽë¶ 볎ê°ì ë ìŽì ì¬ì©ëì§ ììµëë€.
<!-- 1.x -->
<div id="{{ id }}">
<!-- 2.0 -->
<div :id="id">
ìì± ë°ìžë© ëì ë³ê²œ: ìì±ì ë°ìžë©í ë null
, undefined
ë° false
ë§ ê±°ì§ìŒë¡ ê°ì£Œë©ëë€. ìŽê²ì 0
ë° ë¹ ë¬žììŽìŽ ìë ê·žëë¡ ë ëë§ëšì ì믞í©ëë€. ìŽê±°ë ìì±ì 겜ì°. ìŽê²ì :draggable="''"
ê° draggable="true"
ë¡ ë ëë§ëë€ë ê²ì ì믞í©ëë€.
ëí ìŽê±°ë ìì±ì ê²œì° ìì ê±°ì§ ê° ìžìë "false"ì 묞ììŽ ê°ë attr="false"ë¡ ë ëë§ë©ëë€.
v-on
ì¬ì©ì ì§ì êµ¬ì± ìììì ì¬ì©íë©Ž ìŽì íŽë¹ êµ¬ì± ìììì $emitted ì¬ì©ì ì§ì ìŽë²€ížë¥Œ ìì ëêž°í©ëë€. (ë ìŽì DOM ìŽë²€ížë¥Œ ìì íì§ ìì)v-else
ë ë ìŽì v-show
ì íšê» ìëíì§ ììµëë€. ê·žë¥ ë¶ì ííì ì¬ì©íìžì.{{* foo }}
)ì ë ìŽì ì¬ì©ëì§ ììµëë€. ëì v-once
ì¬ì©íìžì.:style
ë ë ìŽì ìžëŒìžì ì§ìíì§ ììµëë€. !important
propsData
ì¬ì©).el
ìµì
ì ë ìŽì Vue.extend
ìì ì¬ì©í ì ììµëë€. ìŽì ìžì€íŽì€ ìì± ìµì
ìŒë¡ë§ ì¬ì©í ì ììµëë€.Vue.set
ë° Vue.delete
ë Vue ìžì€íŽì€ìì ìëí ì ììµëë€. ìŽì data
ìµì
ìì 몚ë ìµìì ë°ì ìì±ì ì¬ë°ë¥Žê² ì ìžíŽìŒ í©ëë€.$data
륌 ë°êŸžë ê²ë êžì§ë©ëë€. ìŽê²ì ë°ìì± ìì€í
ì ìŒë¶ ì£ì§ ìŒìŽì€ë¥Œ ë°©ì§íê³ êµ¬ì± ìì ìí륌 ë³Žë€ ììž¡ ê°ë¥íê² ë§ëëë€(í¹í ì í ê²ì¬ ìì€í
ì 겜ì°).vm.$watch
륌 íµíŽ ìì±ë ì¬ì©ì ê°ììë ìŽì ì°ê²°ë êµ¬ì± ììê° ë€ì ë ëë§ëêž° ì ì ì€íë©ëë€. ìŽë¥Œ íµíŽ ì¬ì©ìë êµ¬ì± ìì륌 ë€ì ë ëë§íêž° ì ì ë€ë¥ž ìí륌 ì¶ê°ë¡ ì
ë°ìŽíží ì ììŒë¯ë¡ ë¶íìí ì
ë°ìŽížë¥Œ íŒí ì ììµëë€. ì륌 ë€ìŽ êµ¬ì± ìì ìíì ë³Žê³ ìíìŽ ë³ê²œëë©Ž êµ¬ì± ìì ì첎 ë°ìŽí°ë¥Œ ì
ë°ìŽíží ì ììµëë€.
êµ¬ì± ìì ì ë°ìŽíž í DOMìŒë¡ ìì ì ìííë €ë©Ž ì ë°ìŽížë ìëª ì£Œêž° íí¬ë¥Œ ì¬ì©íêž°ë§ íë©Ž ë©ëë€.
$dispatch
ë° $broadcast
ì¬ì© ì€ëšì ì²ëŠ¬íë ë°©ë² $dispatch
ë° $broadcast
ì¬ì©íì§ ìë ìŽì ë êµ¬ì± ìì ížëŠ¬ 구조ì ìì¡Žíë ìŽë²€íž íëŠìŽ êµ¬ì± ìì ížëŠ¬ê° ì»€ì§ ë ì¶ë¡ íêž° ìŽë €ìž ì ìêž° ë묞ì
ëë€(ê°ëší ë§íŽì: í° ì±ìì ì íì¥ëë©° ëì€ì ê³ íµì 겪ì ì ìëë¡ ì€ì íê³ ì¶ì§ ììµëë€.) $dispatch
ë° $broadcast
ë íì êµ¬ì± ìì ê°ì íµì ì íŽê²°íì§ ììµëë€. ëì Node.js ì
var bus = new Vue()
// in component A's method
bus.$emit('id-selected', 1)
// in component B's created hook
bus.$on('id-selected', this.someMethod)
ê·žëŠ¬ê³ $off륌 ì¬ì©íì¬ ìŽë²€íž ë°ìžë©ì íŽì íë ê²ì ìì§ ë§ììì€.
// in component B's destroyed hook
bus.$off('id-selected', this.someMethod)
ìŽ íšíŽì ê°ëší ìë늬ì€ìì $dispatch
ë° $broadcast
륌 ë첎í ì ììµëë€. ê·žë¬ë ë ë³µì¡í 겜ì°ìë Vuex륌 ì¬ì©íì¬ ì ì© ìí êŽëŠ¬ ê³ìžµì ëì
íë ê²ìŽ ì¢ìµëë€.
íí°ì ë³Žë€ ìŒë°ì ìž ì¬ì© ì€ íëìž v-for
륌 ì¬ì©í ëª©ë¡ íí°ë§ì ê²œì° ìŽì ì볞 ë°°ìŽì ì²ëŠ¬ë ë³µì¬ë³žì ë°ííë ê³ì°ë ìì±ì ì¬ì©íë ê²ìŽ ì¢ìµëë€( ì
ë°ìŽížë ë°ìŽí° 귞늬ë ìì ì°žì¡°). ìŽì ì ë ìŽì ììì íí° êµ¬ë¬ž/APIì ìíŽ ì íëì§ ìëë€ë ê²ì
ëë€. ìŽì ëšìí JavaScriptìŽë©° ê³ì°ë ìì±ìŽêž° ë묞ì íí°ë§ë 결곌ì ìì°ì€ëœê² ì¡ìžì€í ì ììµëë€.
ëí ìŽ í ë¡ ì€ë ë륌 ì°žì¡°íììì€.
debounce
ëí v-model
debounce
ì ì¬ì© ì€ëšì ì²ëŠ¬íë ë°©ë² v-model
묎ìì
ëê¹?ëë°ìŽì±ì Ajax ìì² ë° êž°í ë¹ì©ìŽ ë§ìŽ ëë ìì
ì ì€ííë ë¹ë륌 ì ííë ë° ì¬ì©ë©ëë€. v-model
ëí Vueì debounce
ìì± ë§€ê°ë³ì륌 ì¬ì©íë©Ž ìŽë¥Œ ìœê² ìíí ì ìì§ë§ ì íìŽ ë°ë¥Žë ê°ë¹ìŒ ìì
ì첎볎ë€ë _ìí ì
ë°ìŽíž_륌 ëë°ìŽì€í©ëë€.
ìŽë¬í ì í ì¬íì ê²ì íìꞰ륌 ëììží ë ë¶ëª
íŽì§ëë€. ê·ž ì륌 ìŽíŽë³Žììì€. debounce
ìì±ì ì¬ì©íë©Ž ì
ë ¥ì ì€ìê° ìíì ëí ì¡ìžì€ ê¶íì ìê² ëë¯ë¡ ê²ììŽ ììëêž° ì ì ëí° ì
ë ¥ì ê°ì§í ë°©ë²ìŽ ììµëë€. Vueìì ëë°ìŽì€ êž°ë¥ì ë¶ëŠ¬íì¬ ì ííë €ë ìì
ë§ ëë°ìŽì€í ì ììµëë€.
ëë°ìŽì±ìŽ ì¬ë°ë¥ž ëíŒ êž°ë¥ìŽ ìë 겜ì°ë ììµëë€. ê²ì ì ìì ìíŽ API륌 ì¬ì©íë ë§€ì° ìŒë°ì ìž ììì ì¬ì©ìê° ì
ë ¥ì ì€ì§í ëê¹ì§ ì ìì ì ê³µíꞰ륌 êž°ë€ëŠ¬ë ê²ì ìŽìì ìž ê²œíìŽ ìëëë€. ëì ìíë ê²ì ì¡°ì êž°ë¥ ì
ëë€. ìŽì debounce
ëíŽ lodash ì ê°ì ì ížëŠ¬í° ëŒìŽëžë¬ëŠ¬ë¥Œ ìŽë¯ž ì¬ì©íê³ ììŒë¯ë¡ throttle
륌 ì¬ì©íëë¡ ëŠ¬í©í ë§íë ë° ëª ìŽë°ì ê±žëŠ¬ì§ ììµëë€!
í¹ì êž°ë¥ì ë 늜 ì€íí ë¹ëììë§ ì¬ì©í ì ìë€ë ê²ì ë°©êž ë³Žììµëë€. ìŽê²ì NPM ë²ì 곌 ìë¹í ë€ë¥Žë€ë ê²ì ì믞í©ëê¹?
@rekateka 2.0 ë 늜 ì€íí ë¹ëë (컎íìŒë¬ + ë°íì)ì ì믞í©ëë€. NPM íší€ì§ì Ʞ볞 ëŽë³ŽëŽêž°ë ë°íì ì ì©ì ëë€. NPMìì ì€ì¹íë ê²œì° ë¹ë ë구륌 ì¬ì©íì¬ í í늿ì 믞늬 컎íìŒí ê°ë¥ì±ìŽ ëêž° ë묞ì ëë€.
ê°ì¬í©ëë€, @yyx990803. 컎íìŒë¬ ë° êž°í êž°ë¥ì ëíŽ ìì§ ëª ê°ì§ ì§ë¬žìŽ ë ìì§ë§ í¬ëŒ ì ì¬ì©íìµëë€.
í¹ìëŒë ê²í íŽìŒ íë 묞ìì ì°ë €í ë§í ë³ê²œ ì¬íìŽ ììµëê¹? íë¥í ìŒ! íëŽìžì. ì¹ ê°ë°ì ì¬ì ìíê³ ììµëë€. ê°ì¬í©ëë€!
ëŽ ì§ì묞ì this.arg
ë°ì ì ììµëê¹?
vnode.data.directives
ìŽ arg
ê° ìë ê²ì 볎ìì§ë§ ë ê° ìŽìì ì§ìë¬žìŽ ììŒë©Ž index
ì ì ììµëë€.
<!-- show @ 0, img @ 1-->
<img v-show="true" v-img:200*200="imgSrc">
<!-- img @ 0, show @ 1-->
<img v-img:200*200="imgSrc" v-show="true">
forEach
ì¬ì©íŽìŒ í©ëê¹? ê°ì¬í©ëë€!
@banricho ì¢ì ì , ê°ê³Œíìµëë€! ì ë°ìŽížë ì§ì묞 êž°ë¥ ìëª ì ì°žì¡°íììì€.
ì°ì ì¬êž°ìì ìŽ ë¬žì 륌 ì êž°í ì ìëì§ íì ìŽ ìì§ ìê³ ìœê°ì ì구 ì¬íìŽ ììµëë€.
ì구 ì¬íì ë€ì곌 ê°ìŽ êµ¬ì± ììì ì¬ì©ì ì€ê³í ì ìꞰ륌 ë°ëëë€.
<carousel>
<img src="..." alt="..." desc="..." is="argument">
<img src="..." alt="..." desc="..." is="argument">
</carousel>
ììŽë€ìŽ ìì±ì ì íìŽ ìë ìŒì¢
ì ë
Œê±°ê° ëêžž ë°ëëë€.
ì§êžì ë€ì곌 ê°ì ì©ëë¡ êµ¬ì± ìì륌 ë§ë€ ì ììµëë€.
<carousel items="[{}, {}, {}]"></carousel>
íì§ë§ ë³ë¡ ì¢ì§ë ìì ê² ê°ìì. ìŽì ì React 컀ë²íë¡ ìì ë§ë ê²ê³Œ ê°ì ì ìꞰ륌 ë°ëëë€.
@andyyou - ê·ž ì§ë¬žì ìë§ë í¬ëŒì ê°ì¥ ì ê²ìë ê²ì ëë€. ìëíë©Ž ê·žê²ì 묞ì ë, ëª íí ì ìë, ìŽ ë¬žì ì ëí ì€ì§ì ìž ëìë ìëêž° ë묞ì ëë€.
í¬ëŒ ì€ë ëìì Vueë¡ ì구 ì¬íì 충족í ì ìë€ë ê²ì ìê² ëë©Ž ì¬êž°ìì ì 묞ì 륌 ìŽ ââì ììµëë€.
ì€ìœ§
@smolinari ê°ì¬í©ëë€
"íì§ë§ ë ë³µì¡í 겜ì°ìë Vuex륌 ì¬ì©íì¬ ì ì© ìí êŽëŠ¬ ê³ìžµì ëì íë ê²ìŽ ì¢ìµëë€." ìŽê²ì ìíê° ìŽë²€ížì ëíŽ ì¬ì©ëìŽìŒ íšì ì믞íë ê² ê°ìµëë€. ëë ê·žê²ë€ì ìì í ë¶ëŠ¬ë ê²ìŒë¡ ëŽ ëë€. ìŽë²€ížë ìê°ì í ìê°ìŽì§ë§ ìíë ë³ê²œëì§ ììµëë€. ìí륌 볌 ì ìë€ê³ ë§í ì ìì§ë§ ìŽë í¹ì ìê°ì ì ë¬íë ê²ìŽ ìëëŒ ë¬Žìžê°ê° ë³ê²œë ëë§ë€ ì ë¬í©ëë€. ìŽ ì¶ì²ì ì믞ì êŽì¬ìŽ ììµëë€.
@jrenton ìŒë°ì ìŒë¡ ìŽë²€íž ìì€í
ì ëšìí êµ¬ì± ìì Aê° êµ¬ì± ìì Bìê² ìí륌 ë³ê²œíëë¡ ì§ìíê±°ë Aê° Bìê² ë€ë¥ž ìì
ì ìííëë¡ ì§ìíë ê²ìŒë¡ ê°ì£Œí ì ììµëë€.
ë°ëŒì 첫 ë²ì§ž 겜ì°ìë ìŽë²€íž ìì€í
ì ì¬ì©íì¬ Aê° Bìê² ìí륌 ë³ê²œíëë¡ ì§ìíë ëì ìí êŽëŠ¬(A ë° Bì ê³µì ìí êŽëŠ¬)륌 ì¬ì©í ì ììµëë€.
ë ë²ì§ž 겜ì°ìë 'ìŽë²€íž ë²ì€' ë°©ììŒë¡ ꜀ ì ì²ëŠ¬í ì ìë€ê³ ìê°í©ëë€.
@jrenton ì ìë¡ ëííë êµ¬ì± ììì ìí ëì
Vueì íšê» Twig륌 ì¬ì©íê³ ììµëë€.
ì§êžê¹ì§(vue 1.0) ë€ì곌 ê°ìŽ êµ¬ì± ììì ë°ìŽí°ë¥Œ ì ë¬íìµëë€.
<my-component data="{{ DATA }}"><my-component>
( {{
ë° }}
ë ëëê°ì§ íê·žì
ëë€. vueì ê²œì° ì¬ì©ì ì ì êµ¬ë¶ êž°íž ${
ë° }
)
ëŽê° ì¬ë°ë¥Žê² ìŽíŽíê³ ìë€ë©Ž Vue 2.0ìì ë€ì곌 ê°ìŽ íŽìŒ í©ëë€.
<my-component :data=" '{{ DATA }}' "></my-component>
ì€ë¥žìªœ?
@gholol ìë ê·žë¥
<my-component :data="{{ DATA }}"></my-component>
ì€ì ë¡ ìŽì ì¬ì©ë²ìŽ ì²ìë¶í° ìëíŽìë ìëë ê² ê°ìµëë€.
ì ìëíìµëë€ ...
ëŽê° ë§íë¯ìŽ, ë°ìŽí°ë ëëê°ì§ í í늿 ìì§ìì ëìµëë€. ìŽì Vue 2.0ììë ìëíì§ ììµëë€. ëë ë¹ì ìŽ ë§íë¯ìŽ (ëšìŒ ìí¬ì€ížë¡íŒììŽ) ì ë¬íë €ê³ íì§ë§ ë°ìŽí° ìì±ìŽ ì ìëì§ ììµëë€.
ì€ë¥: SyntaxError: ìì± ëª©ë¡ ë€ì } ëëœ
ížì§ : ìëí©ëë€. DATA ë³ìê° ë¬žììŽìŽëŒë ê²ì ììŽ ë²ë žìµëë€.
@jrenton ëŽ ììŽëìŽì ëêž°ë ë§€ì° ê°ëší©ëë€. Vueë JSX륌 ì¬ì©íëë¡ ê°ìíë React륌 ì¢ìíì§ ìë ê² ê°ìµëë€. ë§ì template
ì íí ì ììµëë€.
slim
ì ê°ì ìŒë¶ í
í늿 ìžìŽìì 맀ê°ë³ì(ìžì)ë¡ ë§€ê°ë³ì(ìžì)륌 ì ë¬íë 맀ê°ë³ìë¡ ìì ìì 구묞ì ì¬ì©í ì ìꞰ륌 ë°ëëë€. ìì±ìŽ ì¡°êž ë§ê±°ë ìì± ìŽëŠìŽ ìë¹í êžžë©Ž ë€ìì ì
ë ¥íŽìŒ í©ëë€. 몚ë ê²ì í ì€ì. í ì€ì ìœë륌 80ì ìŽììŒë¡ ë§ëë ê²ìŽ ë ìœìµëë€.
@yyx990803 ì€ë íìíì§ ìê³ ì¶ììµëë€. ë¶ííë ë ìŽì ëšì 볎ê°ë²ì ì¬ì©í ì ìêž° ë묞ì <input type="text" name="account[categories][{{ category.id }}]">
ìì ê°ëší ìì
ì ìííë €ë©Ž ìŽë»ê² íŽìŒ í ê¹ì? 2.0?
ES6 ìžëŒìž í í늿ì ë°ìžë© ííììì ìëí©ëë€.
<input type="text" :name="`account[categories][${ category.id }]`">
ê·žê²ìŽ 2.0ìì ìëíëë¡ íë ì ìŒí ë°©ë²ìŽëŒë©Ž 1.0ìŽ ì°ëŠ¬ìê² ìµìíŽì§ ë©ì§ 구묞ì íê·ëŒê³ ë§íë ê²ì ì 겜ì°ì§ ë§ììì€. ì, ê·žê²ìŽ ë°ë¡ ES2015ëŒë ê²ì ìëë€.
ì±ë¥ìì ìŽì ë¡ ë³Žê°ìŽ ì ê±°ëìë€ê³ ê°ì í©ëê¹? ë ì¶í 구묞ì ê°ì¹ê° ìꞰ륌 ë°ëëë€.
@oskarkrawczyk DOMìì name="account[categories][fruits]"
ì ê°ì ê²ìŒë¡ ëëꞰ륌 ìíë€ê³ ê°ì í©ëë€. ìŽê²ìŽ ê·íì ííììŽ ë ëë§íë ê²ìŽêž° ë묞ì
ëë€.
2.0 ë²ì (ì¬ì€ì ì ì í 1.0)ì :name=" 'account[categories][' + category.id + ']' "
ì
ëë€.
@simplesmiler ìŽíŽíìµëë€. {{ }}
ìŽ(ê°) ì 륌 ìœê° ë§ì³ ëì ê² ê°ìµëë€.
@ yyx990803 ìŽì ê°ìŽ êµ¬ì± ìì륌 ëì ìŒë¡ ìœì í ì ììµëê¹?
render () {
return this.$createElement('div', { staticClass: 'list-container' }, this.list)
},
data () {
return {
list: []
}
},
method: {
a () {
this.list.push(this.$createElement('myComponent', {}))
}
}
ííìì ìì¡Žíë ìì±ì ëíŽ ëª ê°ì§ ê°ì ìŽë»ê² ë°ìžë©í ì ììµëê¹? ì륌 ë€ìŽ:
new Vue({
el:'body',
data:{
flag: true
}
})
<input type="text" v-bind:placeholder="{test: flag, test2: !flag}" />
ë€ì 결곌륌 êž°ëí©ëë€.
<input type="text" placeholder="test" />
<!-- or -->
<input type="text" placeholder="test2" />
@nervgh ìŽê²ì ìŽ ì§ë¬žì íêž°ì ì ì í ì¥ìê° ìëëë€.
ìŒí ííì v-bind:placeholder="flag ? 'test' : 'test2'"
í©ëë€.
@simplesmiler , ëµë³ ê°ì¬í©ëë€. _Object-Syntax_ ê° ìŽë¬í 겜ì°ì ì ì©í ê²ìŽëŒê³ ë§íë €ê³ íì§ë§ ììëë¡ ìëíì§ ììµëë€.
@nervgh ê°ì²Ž 구묞ì 묞ììŽ ëª©ë¡ì ì¬ì©íë ìì±ìë§ ì ì©í ì ììµëë€. Ʞ볞 ìì± ì€ ì ìŒí ìì±ì class
ìŽë©° êµ¬ì± ììì ê²œì° ë¬žììŽ ëª©ë¡ ëë ì ì í ê°ì²Žë¥Œ 볎ëŽë €ë ê²ìžì§ ì¬ë¶ë¥Œ ìì ìž¡ìì ê°ì§í ë°©ë²ìŽ ììµëë€.
Re: .once
ë° .sync
ë ë ìŽì ì¬ì©ëì§ ììµëë€.
ìŽê²ì ì ë§ ìŒë°ì ìž ëììž íšíŽì 깚ëšëŠ¬ì§ ììµëê¹?
ìŽê²ë€ìŽ ììŒë©Ž ìì íë륌 ì²ëŠ¬íêž° ìí ê°ëší êµ¬ì± ìì륌 ê°ì§ ì ìë€ê³ ìê°í ì ììµëë€.
ë€ìí ìì íë ì íì ëí ê°ëší êµ¬ì± ììê° ììµëë€. ì륌 ë€ìŽ ë€ìì "í ì€íž ìì" êµ¬ì± ìì í í늿ì ëë€.
<label>{{type.caption}}:<input type="text" v-model="data"></label>
...ëí ë°ìŽí° 구조ì ë°°ìŽìì ìì륌 ì¶ê° ë° ì ê±°íêž° ìí UI륌 ì ê³µíë 목ë¡ì ëí ë³Žë€ ë³µì¡í êµ¬ì± ìì
ê·žë° ë€ì ë€ì곌 ê°ìŽ ìŽë¬í êµ¬ì± ìì륌 ì¬ì©í©ëë€.
<div v-for="field in type.fields">
<component :data.sync="data[field.name]" :is="field.ctype" :type="field">
ì°žê³ : ìŽ ëªšë êµ¬ì± ìììë data
ë° type
ë ê°ì§ ìíìŽ ììµëë€. data
ë ížì§ ì€ìž ë°ìŽí° 구조ì ë
žëìŽë©° ížì§ì ìí UI ì ê³µì ëŽë¹íë êµ¬ì± ìììŽê³ type
ë ì íìŽ í¬íšë (ëë, ì ì ) ë°ìŽí° 구조ì ë
žëì
ëë€. /íë ê³ìžµ 구조.
.sync
ììŽ ìŽë»ê² ê·žë° ê²ë€ìŽ ìëí ì ììµëê¹?
íì êµ¬ì± ììê° ë¶ëªšìê² ìŽë»ê² ë ìì ìŽ ìŽë€ íì êµ¬ì± ìììžì§ íµì íê³ ë¶ëªšê° ë°ìŽí°ì ìŽë€ ë¶ë¶ì íì í ì ìë ìŽë¬í êµ¬ì± ìì ì¬ìŽì ìŒì¢ ì ë©ìì§ ìì€í ì ë§ëë ê²ì ìŒì ì¬ê°íê² ë³µì¡íê² ë§ëë ê² ê°ìµëë€. ìì í 구조.
ëë ì ë§ë¡ ëŽê° ëê°ë¥Œ ëì¹ê³ ìꞰ륌 ë°ëëë€. ìëíë©Ž êµ¬ì± ìì륌 ì¬ì©íì¬ ë°ìŽí° 구조ì ìŒë¶ì ëí ížì§êž°ë¥Œ ë§ëë ê²ìŽ ìí° íšíŽìŽëŒê³ ë§íë ê²ì²ëŒ 볎ìŽêž° ë묞ì ëë€. ë? ì§êžê¹ì§ ê·žê²ìŽ ëŽê° Vue륌 ì¬ì©í ì ìŒí ê²ì ëë€. ìŽ êž°ë¥ì ì ê±°íë©Ž ì¬ëë€ìŽ ë 깚ëí ìœë륌 ìì±íëë¡ ì¥ë €í ê²ìŽëŒê³ ìê°í©ëë€. ìŒë¶ ì¬ëë€ìê²ë ê·ž ìí¥ìŽ ìì ì ìì§ë§ ë§ì ì¬ëë€ì ìŽ ì íì íŽê²°íêž° ìíŽ íšì¬ ë ìŽë €ìŽ ìœë륌 ìì±í ê²ì ëë€. ìí ìì ì 컎íší°ê° ìííë ì ìŒí ì ì©í ìì ì ëë€. ê³ìíŽì ë ìœê² ë§ëììì€.
@JasonWoof v-model
in 2.0ì ì¬ì©ì ì ì êµ¬ì± ìììì ìëí ì ììµëë€. êµ¬ì± ììë ë€ìì ìííêž°ë§ íë©Ž ë©ëë€.
value
ëŒë ìí ë
žì¶input
ìŽë²€ížë¥Œ ëŽë³Žë
ëë€(ì: this.$emit('input', value)
ì륌 ì°žì¡°íììì€.
@yyx990803 ì€ëª 곌 ë§í¬ ê°ì¬í©ëë€. ìŽì ë ê·žë¥ ë¶ìŽììŽ :
.sync
ì ê±°íë ìŽì ë 묎ìì
ëê¹?
ì¥ì ì ìë³Žê³ ëšì ë§ ë³ŽìŽë€ì. ë§í¬í ìì ë :selected.sync
ëë v-model
ëìŒí 결곌륌 ì»ì ì ììì 볎ì¬ì€ëë€. v-model ë°©ë²ì ëšì ë§ ëŽ
ëë€.
.sync
props륌 ê°ì§ ì ììµëë€.v-modelë¡ ì ííë©Ž ë ëª
ííê³ ê¹šëíŽ ì§ëì§ ëªšë¥Žê² ìµëë€. ë ê²œì° ëªšë ìì êµ¬ì± ììê° ë¶ëªš ìí륌 ìœê² ìì í ì ìë€ë ë¶ëªšì ì ìŒí íìë í
í늿ì prop 구묞ì
ëë€. .sync
ê° ë ëª
ííë€ê³ 죌ì¥íêž°ë í©ëë€.
ë€ë¥ž íëë ê°ì²Ž/ë°°ìŽ/êž°í륌 ìíìŒë¡ ì ë¬í ë íì êµ¬ì± ìììì ë³ê²œí ì ìë€ë ê²ì
ëë€. ë°ëŒì íë¡ê·žëëšžê° ìŽ ê²œì° ìì êµ¬ì± ìììì ìí륌 ë³ê²œí ì ìëë¡ ë³Žíží ì ììµëë€(ìŽë ë§€ì° ìŒë°ì ìŽëŒê³ ê°ì í©ëë€.). ë°ëŒì ê·žë ê² ë§ëë ìì륌 ì ê±°íì¬ ê±žëŠŒëì ëì
íë ê²ì²ëŒ 볎ì
ëë€. 묞ììŽ ê°ì ì ë¬íë ê²ì ê°ì²Ž ê°ì ì ë¬íë ê²ê³Œ ëìŒíê² ìëí©ëë€. .sync
ë ë°ìŽí° ì íì êŽê³ììŽ íì "data" ìíì ìì ìž¡ìì ìž ì ìëë¡ íì¬ ìœë륌 ë ëšìíê³ ìŒêŽëê² ë§ëëë€.
ì ë Vue.js륌 ì²ì ì íì§ë§(3ìŒ ì ) ì§êžê¹ì§ 볌 ì ìë¯ìŽ Vue.jsë ì£Œë¡ ë€ì ë ê°ì§ ìŽì ë¡ ê°ì¹ê° ììµëë€.
ì ìŽë ê·žê²ìŽ ëŽê° ì§êžê¹ì§ ë°ê²¬í ê²ì ëë€.
.sync
륌 ì ê±°íë©Ž Vue.jsê° ë ë²ì§ž ìì
ì ìŒêŽëê² ìííêž° ìŽë µê² ë§ëë ê² ê°ìµëë€.
@JasonWoof ë êµ¬ì± ìì ì첎 ë²ì ìžë¶ì ëª ìì ë ììì ë¶ìì©ìŽ ì¥êž°ì ìž ì ì§ êŽëŠ¬ ê°ë¥ì±ìì 몚ë ì°šìŽë¥Œ ë§ë€êž° ë묞ì ëë€.
... ê·žëŠ¬ê³ ì¬ëë€ìŽ .sync
ì¬ì©íì§ ë§ììŒ í ë륌 ëšìí ë°°ììŒ íë€ê³ 죌ì¥í ì ìì§ë§ ì§êžê¹ì§ ì°ëŠ¬ì 겜íì ë€ëŠ
ëë€. ì¬ëë€ì ìŽê²ì ë묎 ë§ìŽ ìì¡Žíë 겜í¥ìŽ ììŒë©° ëì€ì ê±°ì ëë²ê·ží ì ìë ìœë륌 ìì±í©ëë€.
ê·žëì ìŽê²ì ì¬ëë€ìŽ ì²ìë¶í° ì¬ë°ë¥Žê² íëë¡ ê°ìíë ëììž ê²°ì ì ëë€.
ì:
name
ê°ì ëêž°íí©ëë€. 몚ë ê²ìŽ ìë©ëë€.watch
íšì륌 ë§ëëë€. ë©ì§!console.log()
ë£ì ì ìêž° ë묞ì ê·ž ìŽì 륌 ì ì ììµëë€.watch
íšììì ìŽë¬í ìë늬ì€ë¥Œ ìŽë»ê²ë 구ë³í ì ìë ë°©ë²ì ì°ŸìŒë €ê³ í©ëë€....ê·žëŠ¬ê³ ìŽê²ì í ë 벚 ìŽì ê¹ìŽ ëêž°íí ë íšì¬ ë 믞쳀ìµëë€.
ìŽê²ì í¬ëŒê³Œ gitter ì±í ìì ì°ëŠ¬ê° ê³ìíŽì 볎ììš (ë°)íšíŽì ëë€.
.sync
ì ê±°íë©Ž ì¬ëë€ìŽ ì²ìë¶í° ëª
ííê³ ëª
ìì ìŽë©° ì ì§ êŽëŠ¬ ê°ë¥í ìœë륌 ìì±íŽìŒ í©ëë€. ìëíë©Ž ê·žë€ì ìœëë ëë¶ë¶ì ìê° ëì .sync
ëíŽ ì¶©ë¶í ëšìíì§ ìêž° ë묞ì
ëë€.
íìž. ì€ëª íŽì£Œì ì ê°ì¬í©ëë€.
ìŽë€ 묞ì 륌 íŽê²°íë €ê³ íëì§ ë£ë ê²ìŽ ì¢ìµëë€.
ìŽê²ìŽ ëììŽ ë ì§ë ì ë§ ìì¬ì€ëœìµëë€... ì¬ëë€ìŽ ë¹ì ìŽ ì¢ìíë íšíŽì ìœê² ê¹° ì ìëë¡ íê³ ì¬ëë€ìŽ íê³ë¥Œ 극복íêž° ìíŽ íšì¬ ë ëì ìŒì í ì ìëë¡ íììì€.
ìŽê²ì ëìê² ë§ì ì¶ìí륌 ìêž°ìíšë€. ì¶ìíë ì°ëŠ¬ë¥Œ ë§ì 곀겜ì ë¹ ëšëŠœëë€. ê·žê²ë€ì ìœë륌 ìœêž° ìŽë µê² ë§ë€ê³ ëë²ê·žíêž° ìŽë µê² ë§ëëë€.... ê·žë¬ë ì¶ìí륌 ë§ëë êž°ë¥ì ì ê±°íì¬ ìŽ ë¬žì 륌 ê³ ì¹ ìë ììµëë€... ìŽê²ìŽ íë¡ê·žëë°ì ê°ë¥íê²/ì ì©íê² ë§ëë ê²ì ëë€. ìŽì ëí íŽê²°ì± ì ìžìŽë íë ììí¬ ìì€ìŽ ìëëŒ ê°ë¥Žì¹š, ì¡°ìž, íìµì ììµëë€. ì°ëŠ¬ë ì¬ëë€ìŽ ì¬ë¬Œì ì§ëì¹ê² ì¶ìì ìŒë¡ ë§ë€ì§ ìëë¡ ê¶ì¥í©ëë€.
ê·žë° ëììž ì² íì ë§íë ê² ê°ìì. ë§ì ê²œì° ìœë©íë ëì ìŒëì ëìŽìŒ í íë¥í ì² íì ëë€. ê·žë¬ë ê·žê²ìŽ ì íìŒë¡ ë¶ê³Œëê³ íë¡ê·žëëšžê° ìŽ ì íìŽ ê·žë ê° íŽìŒ í ìŒì íì§ ëª»íê² íë€ê³ ìê°í ë, ê·žë ë ìŽ ì íì íŽê²°íêž° ìíŽ ë žë ¥í ê²ì ëë€. ê·žë¬ë©Ž íŒíë €ê³ íë 몚ë 묞ì ê° ë ì íë ê²ì ëë€.
ì¬ëë€ì ìììì ë¶ëªš ìí륌 ë³ê²œíë €ë ìë륌 ë©ì¶ì§ ìì ê²ì ëë€. ì¬ëë€ìê² ê·žë ê² íì§ ë§ëŒê³ ê°ìí ìë ììµëë€.
ê·íì v-model
묞ì ë ë¶ëªš ê°ì²Ž/ë°°ìŽê³Œ í€ë¥Œ ì ë¬íì¬ ìììŽ ìì í ì ìëë¡ íì¬ ìŽ ë¬žì 륌 íŽê²°í ì ìì ë§íŒ 충ë¶í ë³µì¡í©ëë€.
ìŽ ë§ì§ë§ ë¹íž íížê° ëŽê° ì ë¬íë €ë ê²ì íµì¬ìŽëŒê³ ìê°í©ëë€. ì ë (ê°ìžì ìŒë¡) .sync
ì ë¶ì¡±ì 묞ì ë¡ ë³Žê³ ìŽë¥Œ íŽê²°íê±°ë íë ììí¬ë¥Œ ì¬ì©íì§ ìì ê²ì
ëë€. ëë ë§ì ì¬ëë€ìŽ ê°ì ì ê·Œ ë°©ìì ê°ì§ ê²ìŽëŒê³ ì¥ëŽí©ëë€.
ë¹ì°í ìêž°ê² ì§ë§ ì¬ëë€ìŽ ëìê² ëììž ì² íì ê°ìíë©Ž ì¡°êž íê° ëë€. ëë ê¶ë ¥ì ì못 ì¬ì©í ì ìë€ë ëë €ì ë묞ì ìëì ìŒë¡ ê¶ë ¥ì 볎ë¥íë ìì€í ì ì¬ì©íë ê²ë³Žë€ ëì°íê² ì못ëë ê²ì ë§ë€ê³ ë€ìë ê·žë° ìŒì íì§ ìë ê²ì ë°°ì°ê³ ì¶ìµëë€.
ì¶ì ì£ì¡í©ëë€, ì ê° ì€ì€ë¡ë¥Œ ëìž ì ììµëë€, í ë²ë§ ë ëêžì ë¬ê³ ëë©Ž ì¬ë¬ë¶ì ê·žë¥ ëŽë²ë € ëê² ìµëë€. ëë¶ë¶ì íë¡ê·žëëšžë ëë²ê·ží ì ìë ìœë륌 ìì±í©ëë€. ìŽê²ì 몚ë íë ììí¬ì 몚ë ìžìŽì 몚ë íë¡ê·žëëšžìê² ë°ìí©ëë€. ìŽê²ìŽ íë¡ê·žëëšžê° ë ëì íë¡ê·žëëšžê° ëë ë°©ë²ì ëë€. ì€ì륌 íê³ ìì í ì ìë ìœë륌 ë§ë€ê³ 믞ëì ë€ë¥Žê² ìì±íë ë°©ë²ì ë°°ìëë€. 몚ë ì¬ëì ìíŽ íë ììí¬ë¥Œ ë°ë³Žë¡ ë§ë€ì§ ë§ìžì. ì€ì€ë¡ë¥Œ 구ììŒë¡ 몰ìë£ë íë¡ê·žëëšžê° ëë²ê·ží ì ìì ì ëë¡ ìë§ìŽ ëêž° ì ì ìì ì ëŽì©ì ì¢ ë íŒëì€ëœê³ ë³µì¡íê² ë§ë€ ì ììµëë€.
@JasonWoof ê·žê²ì " discorageíê³ êŽì©ì ì룚ì guidenceì ì ê³µ í ê²ì ëë€. ë¹ì ì ë¹ì ì ê°ìžì ìž ì견ì ë°ëŒ ê·žê²ì ëìíì§ ìì ì ìì§ë§, ëë ë¹ì ì 죌ì¥ìŽ ê±°ì ì€ëë ¥ìŽ ìë€ê³ ìê°í©ëë€.
ì¬ëë€ì ìììì ë¶ëªš ìí륌 ë³ê²œíë €ë ìë륌 ë©ì¶ì§ ìì ê²ì ëë€. ì¬ëë€ìê² ê·žë ê² íì§ ë§ëŒê³ ê°ìí ìë ììµëë€.
íì íë. ê·žëŠ¬ê³ ì°ëŠ¬ë 'ê°ì 'íì§ ìì ê²ì
ëë€. ìëíë©Ž ìŽê²ìŽ ì¬ì í íììŒ ì ìë ìŒë¶ ê·¹ëšì ìž ê²œì°ê° ìì ì ìêž° ë묞ì
ëë€. ë°ëŒì this.$parent
ê³ì ì¡ìžì€í ì ìê³ ìí ë±ì íµíŽ $data
륌 ì ë¬í ì ìì§ë§ ìì§í ê·žë ê² íë ê²ì ìŽë²€íž ëë¶ë¶ì $emit
íšì¬ ë ížëŠ¬íì§ ììµëë€. ìê°ìŽ ì§ëë©Ž .sync
ì€íë§íŒ ë§€ë ¥ì ìŽì§ ìì ê²ì
ëë€.
ëí $parent
et.al. ê³µì ê°ìŽëì ìŒë¶ê° ìëë¯ë¡ ìŽë¥Œ ì¬ì©íë ì¬ì©ìë ì ìë ëªšë² ì¬ë¡ì ëíŽ ì ê·¹ì ìŒë¡ ë
žë ¥íê³ ììµëë€. ìŽë ìì ë¡ê² ìíí ì ìì§ë§ ì°ëŠ¬ë ê·žë¬í íëì ê¶ì¥íì§ ììµëë€.
결곌ì ìŒë¡ íë ììí¬ë .sync
ì ê°ì 'ë§ë² ê°ì' 구묞ì ì ê³µíì¬ ì ì¬í ëìì ì¡°ì¥íŽìë ì ë©ëë€. ìŽë¬í êž°ë¥ìŽ ëë¶ë¶ì ìë늬ì€ìì ì€ì©ëê³ íë ììí¬ê° í늜íë €ë ëªšë² ì¬ë¡ì ë°ëëë 겜ì°ì
ëë€.
Youdaì ì€êµìŽ ë²ì ìŽ ììµëê¹? .
vue-routerì ížíì±ì ìŽë»ìµëê¹?
@roblav96
ížíì±ì ìíŽ ëª ê°ì§ ë³ê²œ ì¬íìŽ íìí©ëë€. ëŒì°í°ë¥Œ Vueì ë ì íµí©í ì ìꞰ륌 ë°ëëë€.
@blake-newman
vue-cliìì ìì©êµ¬ í í늿ì íšê» ì»ì ì ììµëê¹? ìŽ ìì ì ìí í ììë ê² ê°ìµëë€ ð¢
@rolav96
íì¬ ëª ê°ì§ê° ììŒë©° vue-loaderì ížíëëë¡ ëª ê°ì§ ë³ê²œ ë³ê²œ ì¬íìŽ íìí©ëë€. íì¬ 2.0ì ëê·ëªš ìì© íë¡ê·žëšì ëí 몚ë ì¶ê° ì¢ ìì±ìŽ ì ë°ìŽížë ëê¹ì§ ì€íì©ìŒë¡ë§ ì¬ì©íŽìŒ í©ëë€.
ë² í/ëŠŽëŠ¬ì€ í볎ì ëí ETAê° ììµëê¹?
@Evertt Alphaë ìŽë² 죌ì
@blake-newman ë¹ ë¥Žê³ ê°ê²°íë©° ìì í ëµë³ì ê°ì¬ë늜ëë€. ê·žê²ë€ìŽ ìµê³ ì ëë€. :-ë
vue 2.0ìì replace: false
ì ëí íŽê²° ë°©ë²ìŽ ììµëê¹?
ìë íìžì, JSXë ìŽë¯ž ì¬ì© ê°ë¥í©ëê¹?
@reohjs - ìëì. ê°ìžì ìŒë¡ Vueê° JSX륌 ì§ìíë€ë©Ž Vueì ëí ì€ì ëšê³ë¡ 볌 ì ììµëë€.
ì€ìœ§
@reohjs ì§ë ë°€ Evanì ì€ížëŠŒìì ê·žë íë¬ê·žìžìŒë¡ ë§ë€ ì ìë€ê³ ìžêžíêž° ë묞ì ìŽê²ìŽ ë² í ë²ì ìŽ ëë©Ž ëêµ°ê°ê° íë¬ê·žìžì ë§ëë ë° ì€ë ê±žëŠ¬ì§ ìì ê²ìŽëŒê³ ìê°í©ëë€. íµì¬ìŽ ìëëŒì êž°ìì§ë§ JSX íë¬ê·žìžì ì¢ì ìê°ì²ëŒ ë€ëŠœëë€.
íµì¬ìŽ ìëëŒì ë€íìŽë€
ð ð ð
ì íë¬ê·žìžìŽìŽìŒí©ëë€. ê·žë¬ë í í늿ì íì€ êµ¬ì± ììì ëíŽ ë§ì ìŽì ìŽ ììµëë€.
JSX 컎íìŒì ë€ì íë¬ê·žìžìŒë¡ ìœê² ë¬ì±í ì ììŽìŒ í©ëë€. https://babeljs.io/docs/plugins/transform-react-jsx/
_h
íšìê° React.createElement
ë첎í ê²ìŽëŒê³ ìê°í©ëë€.
ìë°©í¥ íí°ë¥Œ ë첎íë ë°©ë²ìŒë¡ ì¬ì©ì ì ì v-ëªšëž ìì ì륌 ìì±íë ìží°íìŽì€ë¥Œ ì ê³µíë ê²ì ìŽë»ìµëê¹? ì¬ì©ì ì
ë ¥ì 구묞 ë¶ìíë ë° ìŽë¯ž ì¬ì©ëê³ ìë ê² ê°ìµëë€(ì v-model.trim
). 구묞 ë¶ì/í¬ë§·í
ìŽ ê°ëšíê³ í¹ì ë°ìŽí° ìì±ê³Œ ë
늜ì ìž ê²œì° ìì ì륌 ì¬ì©íë©Ž ê° ê°ë³ ë°ìŽí° ìì±ì ëíŽ ê³ì°ë ìì±ì ì€ì íê±°ë ê°ê°ì ëíŽ ì êµ¬ì± ìì륌 ë§ëë ê²ë³Žë€ íšì¬ ì ì ìì©êµ¬ë¡ 구묞 ë¶ì/íìí륌 ì¬ì¬ì©í ì ììµëë€. 구묞 ë¶ì/í¬ë§·ì ì ì©í ì
ë ¥ ì íì
ëë€.
ìë
íìžì, ì ë íì¬ Vue.js 1.0
ìì gettext
륌 ì§ìíë íë¬ê·žìžì ë§ë€ê³ ììŒë©° vm.$interpolate
ì¬ì©íë ì§ìë¬žìŽ ììµëë€.
ë€ì ìŽíë¡ ëŽ ìœë륌 2.0
ë¡ ë§ìŽê·žë ìŽì
íë ë°©ë²ìŽ ê¶êží©ëë€.
vm.$interpolate
ë ë ìŽì ì¬ì©ëì§ ììµëë€.2.0
ìžì€íŽì€ë¥Œ ê°ì§ ììµëë€.ìëë©Ž ì§ìë¬žë³Žë€ ë ëì ì ê·Œ ë°©ììŽ ììµëê¹?
import languages from 'src/plugins/translate/languages'
import translateUtils from 'src/plugins/translate/utils'
const translateDirective = {
terminal: true,
params: ['translateN', 'translatePlural'],
paramWatchers: {
translateN: function () {
this.translate()
},
},
isPlural: function () {
return 'translateN' in this.params && 'translatePlural' in this.params
},
bind: function () {
this.boundTranslate = this.translate.bind(this)
this.msgid = this.el.innerHTML.trim()
this.translate()
languages.eventEmitter.on(languages.languageChangedEventName, this.boundTranslate)
},
unbind: function () {
languages.eventEmitter.removeListener(languages.languageChangedEventName, this.boundTranslate)
},
translate: function () {
let n = this.isPlural() ? parseInt(this.params.translateN) : 1
let translation = translateUtils.getTranslation(this.msgid, n)
this.el.innerHTML = this.vm.$interpolate(translation)
},
}
export default translateDirective
Vueê° ì²ììŽêž° ë묞ì ê°ëší ëª ë§ë íìë©Ž, ìŒë°ì ìŒë¡ API ëë _under-the-hood_ ëì°ë¯žì ê°ì륌 ë³Žê² ëìŽ êž°ì©ëë€. JavaScriptë ìŽë¯ž ë§€ì° ê°ë ¥íë©° ê³ì°ë ìì±ê³Œ íë ììí¬ì êž°í ë°ì êž°ë¥ì ì¬ì©íì¬ ê±°ì 몚ë ê²ì ë¬ì±í ì ììµëë€.
ìŽë² _next_ 늎늬ì€ì ê°ì¬ë늜ëë€! ð
@kemar ì ë gettextì ìµìíì§ ìì§ë§ $translate ë©ìë륌 ì¬ì©íì¬ Vue.prototypeì íì¥í ë€ì
{{ $translate('some.Key.path') }}
ë°°ìŽ êµ¬ë¬žìŒë¡ ìì°ì ë±ë¡íë êž°ë¥ìŽ 2.0ìì ì ê±°ëììµëê¹? ìíìì ìì
íì§ ìê³ ìëì ìžì§ ìëì§ ê¶êží©ëë€.
ìŠ:
components: [compA, compB, compC]
ES6ì ì ì¬íŽ 볎ìŽë ìêž°ê° ìë€ë ê²ì ìê³ ìì§ë§ ë°°ìŽ êµ¬ë¬žìŽ ì ì©íë ëª ê°ì§ ìë늬ì€ê° ììµëë€.
ëë ë¹ì ìŽ ìžêž 볌 rendering to native interfaces on mobile
ê°ì§ weex
ëë ê·žê²ìŽ VUEì ë§ëë ê²ìŽ ìŒë§ë ì¬ìŽ ê¶êž Nativescriptì ìŽìŒêž°.
Vueì© Nativescriptì ëŒìžì ë°ëŒ ë ë§ì ê²ì ìžêží Weex ëë Quasar ì ëë€.
ì€ìœ§
dispatch
ëë broadcast
ê° ë ìŽì ììŒë©Ž ìŒë° ìì êµ¬ì± ììë ìŽë²€íž/ë³ê²œ ì¬íì ë¶ëªšìê² ìŽë»ê² ì늜ëê¹? ìŽê²ì êžë¡ë² ë²ì€ ëë vuexì íšíŽì ë§ì§ ìë ê² ê°ìµëë€. ì°ëŠ¬ê° ì§êž ì¬ì©íë ì¬ì© ì¬ë¡ë ê²ì íí°ë¥Œ ìí ë²ì ì¬ëŒìŽëì
ëë€. ë²ì ì¬ëŒìŽë êµ¬ì± ììë ìŒë°ì ìŽë©° ì¬ë¬ ê²ì íí°ì íì í목ì
ëë€. ì°ëŠ¬ë íì¬ ë²ì ì¬ëŒìŽëê° ì¬ëŒìŽë©ì ìë£íì ë dispatch
륌 ì¬ì©í©ëë€. ê·žë¬ë©Ž ë¶ëªšë ë³ê²œ ì¬íì êž°ë°ìŒë¡ ê²ìì ížëŠ¬ê±°íë ê²ì ìê² ë©ëë€.
@jrenton ìžëŒìž 늬ì€ë <child @some-event="parentHandler">
ìíìŽ.
ëŽ êŽì ìì 몚ë ë³ê²œ ì¬íì ë°ë¥Žë©Ž ìµìì ì ê·Œ ë°©ìì "ëšë°©í¥ íëŠ"ë§ì êž°ë°ìŒë¡ êµ¬ì± ìì ížëŠ¬ë¥Œ ë§ëë ê²ì ëë€. ìŽë íšì¬ ë ê°ëšíê³ ëë²ê·ž ë° ì ì§ êŽëŠ¬íêž° ìœìµëë€.
ìŽê²ìŽ ììŒë©Ž ë°ìŽí° ì§ì€ì±ì ìµìì êµ¬ì± ìììì ìŒë§ë ë©ëŠ¬ ëšìŽì ž ìëì§ì ë°ë¹ë¡í©ëë€.
íê³ ì¶ì ë§:
render (h) {
return (
<div>
{this.things.map(thing => <Thing thing={thing}></Thing>)}
</div>
);
ë íë³µíê² íŽ
2.0ìŽ ì¶ìëêž° ì ì ìŽ ëª©ë¡ì ë ë§ì ê²ìŽ ì¶ê°ë ê²ìŒë¡ ììë©ëê¹? 묞ì ê° ìì§ ìŽë € ìêž° ë묞ì ê¶êží©ëë€.
@zephraph ì, API륌 ì ë°ìŽížíë©Žì 목ë¡ì ì§ìì ìŒë¡ ì ë°ìŽížíê³ ììµëë€. ð ì§êžê¹ì§ í° ê²ì ìì§ë§ ìŽì ìíìì ê°ë 깚ë ë³ê²œ ì¬íìŽ ììµëë€.
ëë 곌거ì ìŽë²€íž ëì€íšì¹ì ì¬ì©íê³ vuexê° ë¶ìŽìë 겜ì°ê° ììµëë€. ë¶ëªš êµ¬ì± ìììë ìì êµ¬ì± ìì 목ë¡ìŽ ìê³ ììì ê°ìŽ ë³ê²œëìì ë ìŽë²€ížë¥Œ ì ë¬íì¬ ë¶ëªšê° ë€ì곌 ê°ìŽ í ì ìììµëë€. ê·ž ë³íì ë°ì.
ìŽì vuex ì ì¥ìì ìì ê°ì ë°°ìŽì ê°ì§ë €ê³ íìµëë€. 묞ì ë ìì êµ¬ì± ììê° getterì ìì
ìì íŽë¹ ë°°ìŽì ìŽë€ ìì륌 ì
ë°ìŽížíŽìŒ íëì§ ìë ë°©ë²ì
ëë€. ëŽê° ìë í vuexë ê°ì ë³ê²œì ëì ìŒë¡ ê°ì žì€ê±°ë ížëŠ¬ê±°íë êž°ë¥ì ì ê³µíì§ ììµëë€. ìëë©Ž ì ê° ì못 ìê³ ììµëê¹?
ìŽë²€íž ëì€íšì¹ ììŽ ìŽ ê²œì°ë¥Œ ì²ëŠ¬íë ê°ì¥ ì¢ì ë°©ë²ì 묎ìì
ëê¹?
$broadcast
ìŽ ì ê±°ë ìíìì í¹ì ìŒìŽ ë°ìíì ë ì§ì ìë
ìê² ìŽë»ê² íëŒê³ ë§íê² ìµëê¹? ìŽê²ì ë°ìŽí°ê° ì€ì ë¡ ë³ê²œëì§ ìì ìë늬ì€ê° ë ê²ìŽë¯ë¡ 늬ì¡í°ëž propsê° ì í©íì§ ìì ê² ê°ìµëë€.
ìíì ì¬ì©íê³ íìì€í¬íë ììì ë°ìŽí°ë¥Œ ì ë¬íê³ ìììì íŽë¹ ìíì 볌 ì ìì§ë§ ìŽìíŽ ë³Žì ëë€. ì ì ìŽë²€íž ë²ì€ë ê³ ì ID ìì±ìŽ íìíë¯ë¡ ììì ë¶ëªš êµ¬ì± ììì ë€ë¥ž ìžì€íŽì€ê° ìëëŒ ë¶ëªšì ìŽë²€ížìë§ ë°ìí©ëë€.
ë¶ëªšê° ìžëŒìž 늬ì€ë륌 ì¬ì©íì¬ ë€ì ì ìë ììì $emit
ê° ììµëë€. ë€ë¥ž ë°©ë²ìŽ ììµëê¹?
ìíì íµíŽ ìŽë¯ží°ì ìžì€íŽì€ë¥Œ ì ë¬í ì ìê³ , ê·ž ë€ììë ìììê² emmiter.on
륌 ì ë¬í ì ììµëë€. ëì°íê² ë€ëŠ¬ëì?
@gwildu ìì ì ìžì륌 ì¬ì©í ì ììŒë¯ë¡ ìì 곌 íšê» í목 ID륌 ì ë¬í ì ììµëë€. ê·žëŠ¬ê³ ììŽí 컎í¬ëížê° ì€í ìŽìì íŽë¹ ììŽí ì ê°ì žì€ëë¡ íë ëì ë¶ëªšì 목ë¡ì ê°ì žì€ê³ propì ì¬ì©íì¬ ììŽí ë°ìŽí°ë¥Œ ììŽí 컎í¬ëížì ì ë¬í©ëë€.
// Vuex store
state: {
items: [],
},
mutations: {
ITEM_REMOVED: function(state, id) {
var io = state.items.findIndex(item => item.id === id);
state.items.splice(io, 1);
},
},
// within the parent component
vuex: {
getters: {
items: state => state.items,
},
actions: {
removeItem(store, id) {
store.dispatch('ITEM_REMOVED', id);
},
},
},
<!-- within the parent template -->
<item v-for="item in item"
:item-data="item.data"
@removed="removeItem(item.id)"
>
</item>
<!-- within the child template -->
<button @click="$emit('removed')">Remove</button>
í목ì ë¡ì»¬ ê³ ì IDê° ìë ê²œì° íëª©ìŽ ìì±ëê±°ë APIìì ìì ë ë ìì±í ì ììµëë€. ëë¶ë¶ì ê²œì° cuid ë 충ë¶í©ëë€.
@fergaldoyle ë¶ëªšê° íì ìììì ìê³ ìêž° ë묞ì ììì v-ref:some-child
륌 ë£ìŽ ììì VMì ëí 찞조륌 ì»ì ë€ì $emit
ëë ì§ì ë©ìë륌 ížì¶í ì ììµëë€. this.$refs.someChild.<methodName>(...)
.
ê·žë¬ë ìŽë²€ížê° íë¬ëŽëŠ¬ë©Ž êµ¬ì± ìì륌 ì¶ë¡ íêž°ê° ì ë§ ìŽë µêž° ë묞ì ìŽ ê²œì° ìí€í ì²ë¥Œ ë€ì ìê°íë ê²ìŽ ì¢ìµëë€.
ëë vuejs 2륌 ê°ì§ê³ ëê³ ììê³ ë¹ì ìŽ íµê³Œíë©Ž Snabbdomì ëíŽ ìì ì°šë žìµëë€.
h('div', {style: {color: '#000'}}, [
h('h1', 'Headline'),
h('p', 'A paragraph'),
]);
ë¹ì ìŽ ì»ë ë ëë§ êž°ë¥ì
<div style="color:#000;"><h1>Headline</h1><p>A paragraph</p></div>
ê·žë¬ë vuejsììë ë€ìì ì»ìµëë€.
<div style="color:#000;"><h1></h1><p></p></div>
í
ì€íž ëŽì©ì ìì íë ë°©ë²ìŽ ììµëê¹( <h1>
)?
@dubcanada ì ê·žë¥ ììŽë€ë¡ ì ë¬íì§ ììµëê¹?
ë§ìì. ê°ì¬ íŽì
ìë . Vue 2.0ì ê³íì ìë ê² ê°ìì Vue 2.0ì ì í ìì€í ìŽë ì ìì ëíŽ ì§ë¬žìŽ ììµëë€. Vue 1.0ììë ëŽê° ì€ì í ìŒë¶ ì í/ì ëë©ìŽì ìŽ ìžì ëëëì§ ê°ì§íŽìŒ íë 겜ì°ê° ì¢ ì¢ ìììµëë€. ìŽì setTimeoutì ì¬ì©íì¬ ìŽ ìì ì ìííì§ë§ ìŽê²ì ë§€ì° íŽí¹ëê³ ì¶ì í ë°©ë²ì ëë€. ì°ëŠ¬ 몚ë ëìí ì ììµëë€. ê·žëì ì ì§ë¬žì V-show/v-ifì ê²°í©ë ì íì ì¬ì©í ë ê°ë¥í ìŽë²€ížë¥Œ íµíŽ CSS ì íì ëì ê°ì§íêž° ìíŽ Vue 2.0ì ìì ê²ì ëê¹?
<my-comp v-show="isVisible" @transition-end="onTransitionEnd" transition></my-comp>
ë€ì Vue 늎늬ì€ìì ìŽì ê°ì ê²ì ë³Žê² ëìŽ ë§€ì° êž°ì©ëë€. :) ì ìŽìŒêž°ë¥Œ ë€ìŽì£Œì ì ê°ì¬í©ëë€.
@sqal ì í íí¬ë¡ ê·žë ê² í ì ììµëë€: https://jsfiddle.net/simplesmiler/Lrk9sxjf/97/
@dubcanada ë€ì 늎늬ì€ìì ì§ìë©ëë€(ìì ìì± ì ë°ìŽí° ìëµ).
íížë¥Œ ë³ŽëŽ ì£Œì @fergaldoyle ë° @simplesmiler ìê² ê°ì¬ë늜ëë€.
ëë 몰ëìµëë€. ë¶ëªšë ìììŽ ëŽë³Žëž ìŽë²€ížë¥Œ ë€ì ì ììµëë€. ë¬Œë¡ ê±°íìŽ ëì§ ìë ìŽë²€ížë¥Œ ë£ë ê²ìŽ ë í©ëŠ¬ì ì ëë€.
ìë 몚ë. ìœê°ì 배겜 ì§ì: ì°ëŠ¬ë webglë¡ ìì íê³ ììŒë©° 3D íë©Žìì ìŒë¶ ìží°íìŽì€ë¥Œ ë§ë€ê³ ì¶ìµëë€. ìŽê²ì ì륌 ë€ìŽ ìºë²ì€ì ëí ìží°íìŽì€ë¥Œ ë ëë§í ë€ì ìºë²ì€ì ëŽì©ì í ì€ì²ë¡ ë³ííŽìŒ íšì ì믞í©ëë€.
ì ë Angular, React ë° Vueë¡ ìì íŽ ììŒë©° ì ìê² Vueê° ê°ì¥ í©ëŠ¬ì ì ëë€! Reactì ëíŽ ìœë ëì react-canvas íë¡ì ížë¥Œ ë°ê²¬íìµëë€. í¥ë¯žë¡ìŽ ì ì ê°ì DOMì ì€ì DOM ë žëë¡ ë³ííë ëì ìºë²ì€ì 귞늜ëë€.
Vue 2.0ë ê°ì DOMì ì¬ì©íê³ ìêž° ë묞ì ìŽì ê°ì ìì ë ìíí ì ìëì§ ê¶êží©ëë€.
ìë íìžì,
.sync
ë° ìŒë° êµ¬ì± ìììì props륌 ì²ëŠ¬íêž° ìí ìŒë° ìí¬íë¡ì 몚ìµì ëí ì€ëª
ì
ëë€.
ê·žëì, ì¶ë°
<component :value.sync="some.value"></component>
ìê²
<component :value="some.value" @update="updateSomeValue"></component>
prop value
륌 ì¶ì íë ë° ê¶ì¥ëë ë°©ë²ì 묎ìì
ëê¹?
ê°ì¥ Ʞ볞ì ìž ê²œì°ìž ê² ê°ë€.
props: ['value'],
computed: {
_value: {
get(){
return this.value;
},
set(newVal) {
this.$emit('update', newVal);
return newVal;
}
}
}
ê·žë¬ë íì€í ìŽê²ì íŽë¹ ê°ì propì ë°ííë ìì êµ¬ì± ììì ìì¡Žíë¯ë¡ êµ¬ì± ììê° ë€ì ê°ì žì€ë©Ž ê°ì¥ ìµê·Œì ë³ê²œ ì¬íì ë°ìí©ëë€...
ê·žê²ì ì°ëŠ¬ê° ìŽì ë€ì곌 ê°ìŽ íŽìŒ íë€ë ê²ì ì믞í©ëê¹?
props: ['value'],
data() {
return {
_val: this.value
}
},
watch: {
value(newVal) {
this._val = newVal;
}
},
computed: {
_value: {
get(){
return this._val;
},
set(newVal) {
this._val = newVal
this.$emit('update', newVal);
}
}
}
ìŽê²ì ê°ì ì ë¬(ë° ë³ê²œ)ì ì²ëŠ¬íê³ , ê°ìŽ ë³ê²œëììì ë¶ëªšìê² ìëŠ¬ê³ , ë³ê²œìŽ ë¶ëªšì ìíŽ ë€ì ì íëì§ ìë ê²œì° ëŽë¶ì ìŒë¡ ë³ê²œì ì¶ì íë ë§ì ìì©êµ¬ì²ëŒ 볎ì ëë€.
ìëë©Ž ì¬êž°ì ìœê°ì vue ë§ë² ë°ìì±ìŽ ëëœ ëììµëê¹?
ëí ì²ëŠ¬í propsê° ë§ìŒë©Ž ìë¹í ë³µì¡íŽì§ ì ììµëë€.
ììŽë€ìŽ ì§ì ë³ê²œíêž° ìíŽ this.$parent.value
ì ì¡ìžì€íë ëíŒ êµ¬ì± ììì props/computed/watches륌 ì²ëŠ¬íë ëíŒ êµ¬ì± ìì륌 ê±°ì 볌 ì ìììµëë€.
@Towerful "ê°ì¹ ì¶ì "ìŽë ì íí 묎ìì ì믞í©ëê¹? ê·žëŠ¬ê³ ëª
ìì this.$emit('value-updated', newValue)
ëì setter ì€íìŒ( this._value = newValue
)ì ìíë ìŽì ë 묎ìì
ëê¹?
ëšë°©í¥ íëŠì ì¥ì ì ë¶ëªšê° ìììŽ ìì²í ë³ê²œ ì¬íì ì ì©íì§ ìêž°ë¡ ê²°ì íê±°ë ììì "ë³Žë¥ ì€"ìŒë¡ íìíê³ ëì€ì ë³ê²œ ì¬íì ì ì©í ì ìë€ë ê²ì ëë€(ì: ìë²ì ë€ì íìž í).
ê³ì°ë ìì±ì ì¬ì©íë @simplesmiler륌 ì¬ì©íë©Ž í
í늿ì ë°ìžë©í ì ììµëë€. v-model
ì¬ì©í ì ììµëë€.
ê·žëŠ¬ê³ setterì getterê° í ê³³ì í¬íšëìŽ ììŒë©Ž ê°ì ì¡ìžì€íê³ êµ¬ì± ìì ëŽìì ê°ì ë³ê²œíê³ ìœë ì 첎ì í©ìŽì ž ìë ê²ê³Œ ë¬ëŠ¬ ê°ìŽ ì
ë°ìŽížë ë ìœê² ìŽëíì¬ êž°ë¥ì 볌 ì ììµëë€.
ëªšëž ëŽìì ëª
ìì ìž ë°©ë²ì ì¬ì©íê³ setter륌 ì¬ì©íì§ ììŒë©Ž methods
ê°ì²Žê° ì€ì ë©ìëì ë¬ëŠ¬ í
í늿ì ëí updateValue
ì í ë©ìëë¡ ìŽì§ëœê² ë ê² ê°ìµëë€.
ì¬ì©ìê° êµ¬ì± ìììì ìµì
ì ì ííë ê²œì° ì ì©ëë©° êµ¬ì± ììë ì íí í목ì íìíêž° ìíŽ íŽë¹ ê°ì ìì¡Ží©ëë€.
ë¹ì ì ê·žê²ì í ì ìëë¡ ê·žê²ì ë€ì êµ¬ì± ììë¡ ì ë¬íë ìì êµ¬ì± ììì ìì¡Žíê³ ììµëë€.
ì¬ì©ìê° ìµì
ì ì íí ë êµ¬ì± ìì ëì€íë ìŽ ì
ë°ìŽížë¥Œ ìëìŒë¡ ížëŠ¬ê±°íì§ ìë í. Vueì ë°ìì±ìì ë©ìŽì§ë ê² ê°ìµëë€.
ë°ëŒì ëŽë¶ ê°ìŽ 'íŽìŒ íë ê²'ì ì¶ì íëë¡ íê³ í
íëŠ¿ìŽ ìŽì ë°ìíëë¡ í©ëë€. setter/getter륌 ì¬ì©íì¬ ìì±ì ëííì¬ ëŽë¶ ë³ê²œ ì¬íì ì¶ì íê³ ìžë¶ ìŽë²€ížë¥Œ ë°ììí€ê³ ìì±ì ê°ìíì¬ ìžë¶ì ìŒë¡ ë³ê²œë ë ëŽë¶ ê°ì ì
ë°ìŽíží©ëë€.
ìë§ë ëë ìë¡ìŽ ë°©ììŒë¡ 뚞늬륌 굎늬Ʞ ìíŽ ê³ êµ°ë¶í¬íê³ ìì ê²ì ëë€.
@Towerful -
ì€ìœ§
@íìí :
ëìê² ë¹ì ìŽ ì€ëª
íë ê²ì 볞ì§ì ìŒë¡ v-model
ì
ë ¥ì²ëŒ ìëíë êµ¬ì± ìììž ê² ê°ìµëë€. ì¬ì©ìë UIìì ìŒë¶ ê°ì ë³ê²œíê³ íŽë¹ ë³ê²œ ì¬íìŽ ë°ìžë©ë ë°ìŽí°ì ìŠì ë°ìëꞰ륌 ìí©ëë€.
ìŽë¬í ì íì êµ¬ì± ììì ê²œì° 2.0ì êµ¬ì± ììì v-model
륌 ì¬ì©í ì ììµëë€.
<my-input v-model="myValue">
// in my-input.vue
<input :value="value" @change="$emit('input', $event.target.value)">
export default {
props: ['value'] //special prop received from v-model
}
ìŽê²ì ì€ì <input>
ììì ì¬ì©ì ì ì ì
ë ¥ 구ì±ììì ëí ìží°íìŽì€ë¥Œ 볞ì§ì ìŒë¡ ëìŒíê² ë§ë€ê³ ìë°©í¥ ë°ìžë©ì ë§ëëë€.
ì¬ë¬ props륌 ë°ë ë ë³µì¡í êµ¬ì± ììì 겜ì°(ëšìí ì¬ì©ì ì§ì ì
ë ¥ìŽ ìëëŒ ë ì¶ìì ìž) .sync
ì¬ì©ì ê¶ì¥íì§ ììµëë€. ëë¶ë¶ì ìí©ìì ì¶ë¡ íêž° ìŽë µêž° ë묞ì
ëë€.
ë¶ëªšë ìììŒë¡ë¶í° ë°ì ê°ìŒë¡ 묎ìì í ì§ ê²°ì íŽìŒ íë©°, .sync
ì²ëŒ ë°ìŽí°ê° ììì ìŒë¡ ë³ê²œëìŽìë ì ë©ëë€.
ìì v-model ì ê·Œ ë°©ììŒë¡ íŽê²°íì§ _ìë_ .sync
륌 ì¬ì©íì¬ ì¬ì í ì ìµí ì륌 ì ê³µí ì ììµëê¹? ê·žê²ì ì¶ì ìŽë¡ ë³Žë€ í ë¡ ì ìí ë ëì êž°ìŽê° ë ì ììµëë€.
ì, ëŽê° 귞걞 ìŽë»ê² ëì³€ìŽ?! OPì ë¶ëª
í ììŒë©° ìŒë¶ ì견 ì ì ìŽì ëí í ë¡ ë ììµëë€! ì§êžì ìœê° ë°ë³Ž ê°ì ëëìŽ ëëë€.
v-model
ê° êµ¬ì± ìììì ì¬ì©ë ì ìë€ë ê²ì ì¡°êž ë ëª
ííê² íêž° ìíŽ ì볞 ê²ì묌ì ì
ë°ìŽíží ì ììµëê¹?
@LinusBorg 뚞늬 ìë¡ v-model
êµ¬ì± ììê° ìëíì§ ìë 겜ì°ë¥Œ ìê°í ì ììµëë€. ìêžìì ê·ž ë¶ë¶ì 빌뚹ììµëë€.
ë³µì¡í ê°ì²Ž êµ¬ì± ììì 겜ì°ìë êµ¬ì± ìì륌 ì€ì²©íë©Ž ë©ëë€. ê·žëŠ¬ê³ ìŽê²ì ëšìŒ ì±
ì êµ¬ì± ìì륌 ë€ì ìíí©ëë€.
íšì¬ ìë¯žê° íœëë€ :)
@íìí
ì¬: v-model
. 묞ì ë v-model
ê° (ìŽë€ ë©Žììë) ëêž°ììŽì§ë§ êµì°š êµ¬ì± ìì ë°ìŽí° íëŠì ê°ìì ëêž°ìŽ( ë°ëªš )ë¡ ìžíŽ 볞ì§ì ìŒë¡ ë¹ëêž°ììŽëŒë ê²ì
ëë€. ëë ìŽê²ìŽ ë§ì ì¬ëë€ì íŒëì€ëœê² íë ê²ì 볎ìë€. ëšë°©í¥ íëŠì propsê° ëêž°ì ìŽì§ ìë€ë ê²ì ë ëª
ííê² ë§ë€ê³ ëêž°ì ìì¡Žíì§ ìëë¡ í©ëë€(ìŽê²ìŽ ë°ë¡ ì¬ë¬ë¶ìŽ ììŽë €ê³ íë ê²ì
ëë€).
Re: ë³µì¡í ë°©ë². ê°ëší 겜ì°ìë íì @value-updated="value = $arguments[0]"
í ì ììµëë€. ë³µì¡í 겜ì°ìë ìŒêŽì±ì ì ì§íëë¡ ìí륌 ì¡°ì í ì ìë ë©ìëê° ìë ê²ìŽ ì¢ìµëë€(ì: ìëìŒë¡ ì
ë°ìŽíž ížëŠ¬ê±°). ë€ì ì§ì ìŒë¡ ìžê·žìšìŽ.
Re: ë°ìì±ìì ë©ìŽì§. ëë ìŽ ë§ì ëìíì§ ìëë€. ê°ëší 겜ì°ìë value-updated="value = $arguments[0]"
ì
ë°ìŽížë ê°ì ììŽê° ì ííëë¡ íë ë§ë²ìŽ íìíì§ ììµëë€.
ë³µì¡í ê²œì° .sync
ìíì ì¬ì©íë©Ž watch
륌 ì¬ì©íŽìŒ íì§ë§ ëª
ìì watch
ë ì€ì ë¡ ë°ìì±ì ìŒë¶ê° ìëëë€. ê³ì°ë ê²ìŒë¡ ííí ì ìë ìë ì
ë°ìŽížë¥Œ ížëŠ¬ê±°íë íì¶êµ¬ì
ëë€. ê·žëŠ¬ê³ ìŽê²ì ê³ì°ë ê²ì²ëŒ ë³ê²œ ì¬íì ëêž°ì ìŒë¡ ë°ìí ì ìêž° ë묞ì ì¢ì§ ììµëë€. ìŽê²ìŽ watch
ë§ìŽ ì¬ì©í ë ë°ìŽí° ì
ë°ìŽížê° ì íëë ë° ëª ë²ì "í±"ìŽ ê±žëŠ¬ë ìŽì ì
ëë€. ì§ì ì€ì²©ë nextTick
ë°ê²¬íë€ë©Ž ì ê° ë¬Žìš ë§ì íëì§ ì ê²ì
ëë€.
ìŽì -updated
ížë€ë¬ë ë ëì ìŽì€ìŒìŽí íŽì¹ë¥Œ ì ê³µíì¬ ìììŽ ìë륌 ííí í ë³µì¡í ëªšëž ë³ê²œ ì¬íì ëêž°ììŒë¡(ëë ëìì ë¹ëêž°ììŒë¡) ì ì©íì¬ ìììŽ ë€ì í±ìì ì
ë°ìŽížë ê°ì ë°ì ì ìëë¡ í©ëë€(ëë ë¶ìŒì¹ ìí륌 ìì ).
@yyx990803 vuejs1 ìì $dispatch ë° $broadcastì ëí ìŽë²€ížê° ììë ê²ê³Œ ì ì¬í $
ë vuejs-esque, ìŽê²ì ëŒìžì ë°ëŒ ëê° ë껎ì§ëë€('on' ëë 'listen'):
Vue.component('cart', {
template: "#cart-template",
data () {
return {quantity : 0 }
},
watch: {
'quantity': function (quantity, oldQuantity) {
console.log('quantity changed from %s to %s', oldQuantity, quantity)
bus.$emit('cart.quantity-changed', quantity)
}
}
});
new Vue({
el: '.container',
data : function () {
return {
quantity: 0
};
},
on: {
'cart.quantity-changed': function (newQuantity) {
console.log('quantity change emitted');
Vue.set(self, 'quantity', newQuantity);
}
},
computed:{
gold: function(){
return this.quantity * 100
}
}
})
ìŽê²ì Ʞ볞ì ìŒë¡ ìëìŒë¡ ì ì ë²ì€ì ì°ê²°ë©ëë€.
ìŽë²€íž ë²ì€ë ì°ëŠ¬ê° ê¶ì¥íê³ ì¶ì íšíŽìŽ ìëëë€. ìŒë¶ ììžì ìž ê²œì°ìë§ ì ì©í©ëë€. ìŒë°ì ìŒë¡ vuexì ê°ì ì€í ìŽ íšíŽìŽ ì ížë©ëë€.
ë²ì€ ì¬ì©ì ë ìœê² ë§ë€ê³ "ê³µìì ìŒë¡ ì§ìëë€"ê³ ëëŒë API륌 구ííë ê²ì ì못ë ì ížì ëë€.
ê·íì ì륌 볎멎 ë êµ¬ì± ììê° ëªšë ì¡ìžì€íë ì ì¥ìì ìëì ì ì¥í ê²œì° ìŽë²€ížê° íìíì§ ììµëë€. container
êµ¬ì± ììì ê³ì°ë ìì±ìŽ ìëìŒë¡ ì
ë°ìŽížë©ëë€.
vuexì ê°ì ì€ì ë§€ì¥ ì룚ì ì ì¬ì©íì§ ìë ê°ëší ìì ìœë:
var store = {
cart: {
quantity: 0
}
}
Vue.component('cart', {
template: "#cart-template",
data () {
return store.cart
},
});
new Vue({
el: '.container',
data : function () {
return store.cart;
},
computed:{
gold: function(){
return this.quantity * 100
}
}
})
vue2ì ìŒë°ì ìž ììŽëìŽë ìì ì 쎬ìíêž° ìŽë µê² ë§ëë ê²ì
ëë€.
ë°ì.
2016ë
7ì 3ìŒ ìŒììŒ ì€ì 11:24, Thorsten LÃŒnborg [email protected]
ìŒë€:
ìŽë²€íž ë²ì€ë ì°ëŠ¬ê° ê¶ì¥íê³ ì¶ì íšíŽìŽ ìëëë€.
ìŒë¶ ì£ì§ ìŒìŽì€ì ì ì©í©ëë€. ìŒë°ì ìŒë¡ vuexì ê°ì ì€í ìŽ íšíŽìŽ ì ížë©ëë€.ë²ì€ ì¬ì©ì ë ìœê² íê³ "ê³µìì ìŒë¡
ì§ìëš"ì ì못ë ì ížì ëë€.â
ë¹ì ìŽ ëêžì ë¬ìêž° ë묞ì ìŽê²ì ë°ë ê²ì ëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê³ GitHubìì íìžíìžì.
https://github.com/vuejs/vue/issues/2873#issuecomment -230158828 ëë ììê±°
ì€ë ë
https://github.com/notifications/unsubscribe/AACoukCpCgYlDbVej_w_h4NEhQ-imYHBks5qR9QwgaJpZM4IedHC
.
@kharysharpe $emit
së ìì ìžì€íŽì€ìì v-on
ë©ëë€. ëí ìžì€íŽì€ê° ì¬ì©ëë ìë 컚í
ì€ížë¥Œ íì©í ì ìë€ë ì¶ê° ìŽì ìŽ ììµëë€.
<list-item v-for="(item, index) in items"
:title="item.title"
@remove="items.splice(index, 1)"
>
</list-item>
2.0 ëŠŽëŠ¬ì€ ë ì§ê° ììµëê¹? ëë ë³íì ꜀ í¥ë¶ëë€. ì¶í íŽì!
Vue 2.0 + Redux륌 ì¬ì©í ìê°ì
ëë€.
@Sendoushi ìµì¢ 늎늬ì€ì ëí ë ì§ë ìì§ ìì§ë§ ë² í ë²ì ì ìŒì£ŒìŒ ìŽëŽìŒ ì ììµëë€. ð Vuex 2.0 ë íšê» ê°ë° ì€ìŽë©° íì¬ vuexë³Žë€ íšì¬ ê°ëší API륌 ì ê³µí ë¿ë§ ìëëŒ reduxë³Žë€ íšì¬ ë ë©ì§ê² Vue ìíê³ì íµí©ë©ëë€.
Vuex 2.0ë íšê» ê°ë° ì€ìŽë©° íì¬ vuexë³Žë€ íšì¬ ê°ëší API륌 ì ê³µí ë¿ë§ ìëëŒ reduxë³Žë€ íšì¬ ë ë©ì§ê² Vue ìíê³ì íµí©ë©ëë€.
@chrisvfritz ì ë§
const mutations = {
LOGIN (state) { state.loggedIn = true },
LOGOUT (state) { state.loggedIn = false }
}
export const types = Object.keys(mutations)
// For now we dynamically generate all the actions like this.
// It's rare when anything more complicated is needed, but there
// is an example here:
// http://vuex.vuejs.org/en/actions.html
export const actions = types.reduce((o, el) => {
var action = S(el.toLowerCase()).camelize().s
o[action] = ({dispatch}, ...args) => dispatch(el, ...args)
return o
}, {})
vue 2ì vuex 2ì ë¡ë맵ì ìŽë»ìµëê¹? íšê» ì¶ìí ê³íìžê°ì ìëë©Ž 뚌ì ì¶ìí ê³íìžê°ì? ê·žëŠ¬ê³ ë€ë¥ž ë²ì ì ížíì±ì ìŽë»ìµëê¹?
ìì ì§ë¬žê³Œ êŽë šíì¬ vue-routerì ìíë 묎ìì ëê¹? Vue 2 ì§ììŽ ê³§ ì ê³µë ìì ì ëê¹ ìëë©Ž Vue 2 í ì€ížë¥Œ ëŒì°í° ììŽ ìííŽìŒ í©ëê¹?
@gwildu ìŽë ì ë íšê» ì¶ìë ìì ìŽë©° Vuex 2.0ì Vue 2.0ë§ ì§ìí©ëë€. 2.0 ìŽì Vuexë Vue 1.xê° ë ìŽì ì§ìëì§ ìì ëê¹ì§ ê³ì ì§ìë©ëë€.
@Uninen Vue Routerë Vue 2.0ìŽ ì¶ìëêž° ì ì ë§ì ì¬ëì ë°ì ê²ì ëë€.
nfo @chrisvfritzì ê°ì¬ë늜ëë€ :)
@chrisvfritz @Uninen ìì : Vuex 2.0ì Vue 1.xììë ìëí©ëë€.
vue-router
ì ë€ì 죌ì ë²ì ì Vue 2.xë§ ì§ìí©ëë€.
ë°íì ì ì© ë¹ë: 컎íìŒë¬ê° í¬íšëìŽ ìì§ ììŒë¯ë¡ 컎íìŒ ëšê³ìì 믞늬 컎íìŒë í í늿ìŽë ìëìŒë¡ ìì±ë ë ë íšìê° íìí©ëë€.
vueify/vue-loader ë° .vue
íìŒì ì¬ì©íì§ ìê³ í
í늿ì ì¬ì 컎íìŒíë ë°©ë²ìŽ ììµëê¹? ê·žë ì§ ìë€ë©Ž 컎í¬ëížì template:
ìì±ì render
íšìë¡ ë³ííë babel íë¬ê·žìžì ì¬ì©íë ê²ìŽ ì¢ìê¹ì?
2.0ìŒë¡ ì ê·žë ìŽë í íìë ì¬ì©ëì§ ìë êž°ë¥ì ê³ì ì¬ì©í ì ììµëê¹?뚌ì 2.0ìŒë¡ ì ê·žë ìŽëí ë€ì ì¬ì©ëì§ ìë êž°ë¥ì ì²ì²í ë³ê²œí ì ììµëê¹?
elementDirectiveê° ì¬ëŒì§ ì§êž í°ë¯žë êµ¬ì± ìì륌 ìì±í ì ììµëê¹?
ë§í ë°ì ê°ìŽ:
v-modelì ë ìŽì ìŽêž° ìžëŒìž ê°ì ì 겜 ì°ì§ ììµëë€. íì Vue ìžì€íŽì€ ë°ìŽí°ë¥Œ ì§ì€ì ìì€ë¡ ì·šêží©ëë€.
ê·žê²ì ê³ ë €
<child-component>
<input type="checkbox" :id="_uid" v-model="childModel" :value="value" />
<label :for="_uid"><slot></slot></label>
</child-component>
ì¬ì©ì ì ì êµ¬ì± ìì ì¬ìŽì ë°°ìŽìŽ ìë 첎í¬ë°ì€ë¥Œ ìŽë»ê² ì²ëŠ¬í©ëê¹?
_ì
ë°ìŽíž 1:_
íŽê²°. prop type="checkbox"
륌 ìì êµ¬ì± ììì íì êµ¬ì± ììë¡ ì ì¡í©ëë€.
<parent-component>
<child-component type="checkbox" v-model="parentModel" value="apple" />
<child-component type="checkbox" v-model="parentModel" value="orange" />
<child-component type="checkbox" v-model="parentModel" value="banana" />
</parent-component>
ê·žë° ë€ì {props: [ 'value' ]}
륌 íµíŽ ìžëŒìž ê°ì ì»ì ì ììµëë€.
ê°ìŽ ë³ê²œëììì ì늬Ʞ ìíŽ ìì êµ¬ì± ììì change
ìŽë²€ížë¥Œ ëŽë³Žë
ëë€.
<child-component>
<input type="checkbox" :id="_uid" v-model="childModel" :value="value"
@change="$emit('change', $event)"
/>
<label :for="_uid"><slot></slot></label>
</child-component>
컎íìŒë¬ê° 컎íìŒíêž° ë묞ì
ëë€ v-model
ì§ì륌 ë°ëŒ ê·ž type
. ê·žëŠ¬ê³ ì»ŽíìŒë¬ë checked
ìíì ìì± íê³ change
ìŽë²€ížë¥Œ ë°ìžë© í©ëë€.
_ì
ë°ìŽíž 2:_
ê·žë¬ë updated
ëŒìŽí ì¬ìŽíŽ íí¬ë v-model
ë¡ ìžíŽ ížëŠ¬ê±°ëì§ ììµëë€. checked
ìì±ì ì§ì ë³ê²œí©ëë€(ìŠ, change
ìŽë²€ížë¥Œ ê°ì žì¬ ì ììì ì믞í©ëë€. v-model
ì ê°ì ìì íì¬ êž°ë³ž html íìžë êµ¬ì± ìì륌 ë§ëëë€.
ë°ëŒì @yyx990803 , v-model
ë³ê²œ í change
ìŽë²€ížë¥Œ ížëŠ¬ê±°í ì ììµëê¹?
@YunSun-CN ê·íì 묞ì 륌 íŽê²°í ì ììë ì ìŒí ë°©ë²ì ala val ê°ì í¹ì í ìì±ì ì¶ê°íê³ ìŽë¥Œ ì¬ì©íì¬ ì€ì ê°ì ì€ì í ë€ì v-model 'ì ë ¥ì ë³ê²œ ì¬íì ëŽë³ŽëŽë ê²ì ëë€. ' ìŽë²€íž.
@johnleider v-model
ê° íë ìŒì ì뮬ë ìŽì
íêž° ìíŽ ì¬ì©ì ì§ì ì§ì묞ì ìì±íìµëë€.
귞걎 ê·žë ê³ , type
prop ë¿ë§ ìëëŒ elementì tagNameì íìžíë©Žì ìë°íê² ëªšëžì ìì±íŽìŒ í©ëë€. ê·žë ì§ ììŒë©Ž type
propìŽ ìë ë€ë¥ž ì¬ì©ì ì§ì êµ¬ì± ììê° êž°ë³ž ëªšëž ëìì ë®ìŽìž ì ììµëë€.
ìë . ì¶ììŒì ìê³ ììµëê¹?
@thanosalexander ìì§ ë ì§ë¥Œ ì íì§ ìììµëë€. ì°ëŠ¬ë 2.0.0-bet.2ë¡ ì í ìì€í ì ëª ê°ì§ 죌ì ë³ê²œ ì¬íì ëì íìŒë©°, ìŽë ì² ì í í ì€ížíŽìŒ í©ëë€. ê·žëì ì ìê°ìë 늎늬ì€ì ëíŽ ìê°í ì ììŒë €ë©Ž ìì§ ëª ì£Œê° ê±žëŠŽ ê²ì ëë€.
ìììŽ.. ê·žëŒ ë ìŽê±žë¡ ê°ê².. ë§êµ¬ê°ìŒë¡ ê°ë ê³ëšìŽ ë묎 íŽ ê² ê°ì§ ìì! ê°ì¬ íŽì
묞ìë ìŽë»ìµëê¹? Vueê° ìŒì° ì±íë ìŽì ì€ íëë 묞ìììŒë©° ì§êž v2ìì ì 륌 ë§ì€ìŽê² ë§ëë ì ìŒí ìŽì ì ëë€. 묞ì륌 ë°ëŒê°ë 묞ì 륌 볎ìì§ë§ 곧 ëë ê² ê°ì§ ììµëë€. ìë§ë ëë íë ìëìì ë묎 ë§ì ìŒìŽ ìŒìŽëê³ ìë€ë ê²ì 묎ìíê³ ììµëë€. ì ì§ë¬žì ì¬ëŠ¬ëì§ ìŽì ê° ììµëë€ :)
2.0ìì êµ¬ì± ìì ì í ìžë¶ì ì í 몚ë륌 구íí ê³íìŽ ììµëê¹?
https://github.com/vuejs/Discussion/issues/156
@miljan-aleksic Docsë 2.0ìŽ ê³µìì ìŒë¡ ì¶ìëë©Ž ì€ë¹ë ê²ì ëë€. ì°ëŠ¬ë ìì§ ë² í ë²ì ì ëë€. ;)
ê·žëê¹ì§ ì¬êž° ìì 묞ì ì§í ìí©ì íìží ì
@aristidesfl ìŽë¯ž ìë£ëììµëë€. ð
@miljan-aleksic @LinusBorgê° ìžêží ëŽì©ì ì¶ê°íì¬ ëë¶ë¶ì ì ê°ìŽëë ìŽë¯ž ìì±ëììŒë©° ìíë ê²œì° ì¬êž°ìì ìì€ë¥Œ ìœì ìë ììµëë€. êžì ì°ë ìì ìì beta.2ì ë³ê²œ ì¬íì ë°ìíëë¡ ìì í ì ë°ìŽížëì§ ìììŒë©° ìë¹í ëë£ ê²í ê° ìì§ ì§í ì€ìŽë©° ê³ ë € ì€ìž ë€ë¥ž ì¬ìí API ë³ê²œ ì¬íìŽ ììµëë€. ë°ëŒì ì€í륌 ìì íê³ ì€ëª ì ê°ì íë ë° ëììŽ ëì§ ìë í ê³µìì ìŒë¡ ê²ìí ëê¹ì§ êž°ë€ëŠ¬ë ê²ìŽ ì¢ìµëë€(RC ëšê³ì ìì ì ìì).
ì°ëŠ¬ë ëí íë¥í 묞ìê° Vueì ì€ìí ë¶ë¶ìŽëŒë ë° ëìí©ëë€. React íì Dan Abramov ì¡°ì°šë ì°ëŠ¬ 묞ì륌 ì¢ìí©ëë€. ð ê·žë êž° ë묞ì 2.0 묞ìê° _íšì¬ ë ë«ë€_ë ê²ìŽ ì ê°ìžì ìž ëª©í ì€ íëì ëë€. ê·ž ìì€ìë...
ìŽê²ì 묞ì ìì±ì ëí ëì 죌ì 늬ìì€ ì€ íëìŽë©° Jasmineì ìµìíë€ë©Ž ìŒë°ì ìŒë¡ ꜀ ìœì ì ììµëë€.
@chrisvfritz , ë§€ì° ì ì©í ì 볎 ê°ì¬í©ëë€. WIPì íìì ë°ëŒ íŒëë°±ì ê³ ë €íì¬ ì 묞ìì êž°í륌 ì ê³µíê² ìµëë€. Vue 2.0ì ëíŽ ì§ì§íê² ìê°í ìê°ì ëë€ ;)
createElement
륌 ì¬ì©íë render íšììì ë°°ìŽì ì²ëŠ¬íì§ ìë ê² ê°ìµëë€(snabbdomì²ëŒ). ížì¶ë íšìì ë°ìŽí°ë¥Œ ì ë¬íë ë°©ë²ìŽ ììµëê¹?
ì륌 ë€ìŽ snabbdomìì ë€ìì ì¬ì©í ì ììµëë€.
{on:{click: [function, dataToPass]}}
ê·žëŠ¬ê³ function
ë 첫 ë²ì§ž ìžìë¡ dataToPass
륌 ì»ìµëë€. ê·žë¬ë ìŽê²ì vuejs 2 beta 2 Uncaught TypeError: arr[i] is not a function
ìì ì€ë¥ê° ë°ìíë ê² ê°ìµëë€. on from create ìì륌 ì¬ì©íì¬ ë°ìŽí° ë° ìŽë²€ížë¥Œ ì ë¬íë ë°©ë²ìŽ ììµëê¹?
@dubcanada Vue 2.0ì ìŽë²€íž ì²ëŠ¬ë
ì¬ë¡¯ ìœí ìž ë¥Œ ë ëë§íë ëì 묞ììŽë¡ ê°ì žì€ë €ê³ í©ëë€. íì€ ë žë륌 ì¬ì©íë©Ž ì¬ìŽ íŽê²° ë°©ë²ìŽ ìì§ë§ Vnodeììë ë°©ë²ì ì°Ÿì§ ëª»íìµëë€. íŽê²° ë°©ë²ìŽ ììµëê¹?
@miljan-aleksic innerHTML
ììì ëŽì©ì ê°ì žìš ë€ì CSSìì display: none
ë¡ ìì륌 ìšêž°ê³ ë ëë§íŽ 볎ììì€.
ëì 죌ì
ì ê°ì¬í©ëë€. ë ëë§íë©Ž ìµì¢
ì¶ë ¥ìŽ ë¬ëŒì§ëë€. pre
íê·žë¡ ìì ìœí
ìž ë¥Œ ëííê³ HTMLì ìžìœë©íë êµ¬ì± ìì륌 ë§ë€ê³ ììµëë€.
ìŽ ê²œì° ì볞곌 ë€ë¥ž ììë¡ ì¶ë ¥ì ë ëë§í©ëë€.
í íëŠ¿ìŽ ìœí ìž ìì± ë°©ììŽ ëìŽìë ì ëë€ë ì ì ê°ì¡°íê³ ì¶ìµëë€. ëŽì© ìì²Žê° ìëëŒ ëŽì©ìŽ ìì±ëë _ë°©ë²_ì ì€ëª íë ë°©ììŽìŽìŒ í©ëë€. í ì€ížë¥Œ JSì 묞ììŽë¡ ì ì¥íë ê²ìŽ ì¢ìµëë€(ëë íë¡ì ížì ë€ë¥ž ìŽëê°ì 늬ìì€ë¡ ì ì¥íë ê²ìŽ ì¢ìµëë€. _í¹í_ ìŽë€ ì¢ ë¥ì ì¬ì©ì ì ë ¥ìž ê²œì°). ê·žë° ë€ì ìŽë¥Œ ìíìŒë¡ ìììê² ì ë¬íë©Ž ìì² ë² ìŒíŽìŒ í©ëë€. ìŽìšë ë ìœìµëë€.
@Kingdaro ë ë§ì ìŽ ë§ìµëë€. ê°ë ì
v-on
ì§ì묞ì ì¬ì©í ë $arguments
ë³ìë ë ìŽì ì¬ì©í ì ììµëë€. ì¬êž°ì íŽë¹ ë³ê²œ ì¬íì ëí ì°žì¡°ê° ììµëë€. ë²ê·ž ëë ëëœë ì°žì¡°ì
ëê¹?
@ miljan-aleksic arguments
.
(ë ê°ì) PHP ê°ë°ìê° ëìŽìŒ í©ëë€... ë¹ì ìŽ ìŽë€ êž°ë¶ìžì§ ìëë€. ã ã ã !
ì€ìœ§
@yyx990803 , @smolinari ì ë... ê·žëŠ¬ê³ ì§êžì ë¶ëëœìµëë€ íí. ëë ìŽë¯ž ê·žê²ì ìëíë€ê³ ì€ì€ë¡ ë¯¿ê² ë§ë€ììµëë€ ... 충ë¶í ìíì§ ëª»í ê² ê°ìµëë€. ìë ì€ì ëë€. ìê°ì íë¹íŽ 죌ì ì ê°ì¬í©ëë€.
ë€ë¥ž "묞ì "ì ëí í°ìŒì ìŽë €ê³ íìŒë ë ìŽì íì€íì§ ìì 겜ì°... ref
ë ë±ë¡ë êµ¬ì± ìì ëë ìì륌 ìŠì ì¬ì©í ì ììŒë¯ë¡ ìŽì ê°ì ê²ìŽ ìëíì§ ììµëë€.
<button ref="button"...></button>
<foo :connect="$refs.button"></foo>
Fooê° ë ëë§ë ë $refs.button
ë ìì§ ì ìëì§ ìììµëë€. Vue 1ìì ììëë¡ ìëí©ëë€. ìŽë²ìë 묎ìì ëì¹ê³ ììµëê¹?
DOM ììë êµ¬ì± ìì ìžì€íŽì€ë¥Œ ìíìŒë¡ ì ë¬íë©Ž ì ëë€ë ì¬ì€ì ëì¹ì šìµëë€...
ê·žê² ì ëì ìê°ìŽìŒ? Button(ížëŠ¬ê±°)ì ì°ê²°íë €ë Dropdown êµ¬ì± ììê° ìë€ê³ ê°ì íŽ ë³Žê² ìµëë€. ë ë€ ë 늜ì ìž êµ¬ì± ìììŽë©° 쿌늬륌 íµíŽ ì°ê²°íë ëì 찞조륌 ì§ì ì ë¬í©ëë€.
@miljan-aleksic ìí륌 íµíŽ ì°ê²°íë ê²ìŽ íšì¬ ì¢ìµëë€.
ìŽë ê² íë©Ž ëë¡ë€ìŽê³Œ ë²íŒìŽ ìì í ë¶ëŠ¬ëê³ ë²íŒì ì¬ì¬ì©íì¬ ë€ë¥ž ì íì êµ¬ì± ìì륌 ì ìŽí ì ììŒë©° ëë¡ë€ìŽì ë€ë¥ž ì íì ì ë ¥ êµ¬ì± ìììì ì ìŽí ì ììµëë€.
ì€ëë ìµêŽì ë²ëŠ¬êž°ê° ìœì§ ììµëë€. jQuery륌 ííŽìŒ í©ëê¹ ìëë©Ž ì£Œë¡ ì 륌 ííŽìŒ í©ëê¹? :ë
ë¹ì ì ì ê·Œ ë°©ììŽ ë§ìµëë€, Evan. Dropdown íµí©ìŽ ë ì§ë£šíëëŒë ê·žë ê² í ê²ì ëë€. ë¶ëªš êµ¬ì± ììë ë€ë¥ž ìŽë²€ížë¥Œ ìì íë ë°©ë²ì ëíŽ ìììŒ íë¯ë¡ ìžë¶ë¥Œ íŽëŠí ë ëë¡ë€ìŽì ìŽê±°ë ë«ë ê²ë¿ë§ ìëëŒ ëë¡ë€ìŽ ì첎륌 ë«ë ê² ë± ëë¡ë€ìŽìŽ íŽê²°í ë§ì ìŽë²€íž ë° íŽê²° ë°©ë².
ë¶ëªš êµ¬ì± ììë ë€ë¥ž ìŽë²€ížë¥Œ ìì íë ë°©ë²ì ëíŽ ìììŒ íë¯ë¡ ìžë¶ë¥Œ íŽëŠí ë ëë¡ë€ìŽì ìŽê±°ë ë«ë ê²ë¿ë§ ìëëŒ ëë¡ë€ìŽ ì첎륌 ë«ë ê² ë± ëë¡ë€ìŽìŽ íŽê²°í ë§ì ìŽë²€íž ë° íŽê²° ë°©ë².
ê·žê²ì ì¬ì í ââí ì ììµëê¹? ëë¡ë€ìŽ êµ¬ì± ìììì addEventListener('body', ... )
륌 ìì í ìííì¬ ìžë¶ íŽëŠ ë±ì ë±ë¡í ì ììµëë€. ì륌 ë€ìŽ ëë¡ë€ìŽì ëêµ°ê° ìžë¶ë¥Œ íŽëŠí ë ë¶ëªšì ëíŽ 'ë«êž°' ìŽë²€ížë¥Œ ê°ëší ëŽë³ŽëŒ ì ììµëë€.
ë€, ë€. ìŒë¶ êµ¬ì± ìì륌 늬í©í ë§í ìê°ì ëë€ :) 몚ë ê°ì¬í©ëë€! ë©ì§ 컀뮀ëí°.
í ì¬ëìŽ ìŽë»ê² ì ì© ëëê° v-model
ì êµ¬ì± ììì createElement
? í
í늿 컎íìŒë¬ë¥Œ ì¬ì©íì¬ ìì±ë ìœë륌 ìŽíŽë³Žìëë°... ìœëê° ë§ìµëë€. ëë ì§ì묞ì ëí 묞ì륌 ì ìŽíŽíì§ ëª»íìµëë€.
Ʞ볞ì ìŒë¡ 컎íìŒ íì ì§ì묞ì ì§ì묞ì ì¶ì¶íê³ ì§ì묞ì ë°íìì ì¡Žì¬íì§ ììµëë€. ì§ìë¬žìŽ ë°íì ì ìììë ì²ëŠ¬ëëë¡ íë €ë©Ž ë³í íšììì true륌 ë°ííììì€.
@blocka render
íšì륌 ì¬ì©íë ê²œì° ëŽì¥ ì§ì묞ì ì¡ìžì€í ì ììµëë€. ëë±í ë
ŒëŠ¬ë¥Œ ì§ì ì²ëŠ¬íŽìŒ í©ëë€. ì륌 ë€ìŽ v-if
ë ìŒí ííììŽê³ v-for
ë array.map()
ííììŽê³ v-model
(ìŒë° <input>
ìì) )ë value
ë°ìžë© ë° input
ìŽë²€íž 늬ì€ëë¡ ë³íë©ëë€.
@ yyx990803 ê·žê² ëŽê° ìê°í ê²ì ëë€. ëë ìë§ë HOCë¡ ê·žê²ì ì²ëŠ¬íê² ë ê²ì ëë€ (ëë ìŽë¯ž ê°ì ë°©ììŒë¡ 조걎ë¶ë¥Œ ì ë¬íê³ ììµëë€ (ëë ìŽê²ì ì¬ì©íë ê²ì ëíŽ ìê°íê³ ìì§ë§)
vue 1ìë vuexì reduxì ë ê°ì§ ì¥ì ìŽ ììµëë€.
ê°ì ëì ì¬ì©íë©Ž 1ì ìŒë¶ ëë ì ì²Žê° ìíë©ëê¹?
@blocka ê·žê²ì ìŒë¶ë¥Œ ìííì§ë§ ì ë°ì ìž ì±ë¥ì ì¬ì í ââReduxë³Žë€ íšì¬ ë«ìµëë€.
2.0ìì ë³ê²œë ê²ì ë°ìì±ì ìžë¶ì±ì ëë€. ë¹êµë¥Œ íŽë³Žì:
shouldComponentUpdate
륌 êŽë²ìíê² êµ¬ííŽìŒ í©ëë€.ìŒë°ì ìŒë¡ 2.0ì ì¬ì©íë©Ž (1.xì ë¹êµíì¬)
ìŒ,
animation.cssë¡ ì íìŽ ìëíì§ ììµëë€.
<transition enterClass="fadeIn" leaveClass="fadeOut" class="animated" mode="out-in">
<router-view keep-alive></router-view>
</transition>
ëêµ°ê° ììŽëìŽê° ììµëê¹?
ìí ìŽëŠìŽ ì못ëììµëë€.
camelCase ë kebap-caseë ì¬ì í 2.0ì ì ì©ë©ëë€.
<transition enter-class="fadeIn" leave-class="fadeOut" class="animated" mode="out-in">
<router-view keep-alive></router-view>
</transition>
@LinusBorg ì£ì¡í©ëë€. ìŽë¯ž ìëíìµëë€. ì¬êž°ì ìì ë°ìŽì¬ëŠ°ìŽ ììµëë€. CSS ì í ë° ìŽëŠ í귞륌 ì¬ì©íë©Ž ì ëë¡ ìëí©ëë€.
https://jsfiddle.net/z0nyfba0/
êµ¬ì± ìììì v-model
륌 ì¬ì©í ë êµ¬ì± ììë v-model
ì íšê» ì¬ì©ëë ìì ì륌 볌 ì ììµëê¹?
ì륌 ë€ìŽ input
ìŽë²€ížë¥Œ ëŽë³ŽëŽë êµ¬ì± ììê° ìë ê²œì° íŽë¹ ìŽë²€ížê° ëŽë³ŽëŽì§ë ìêž°ë lazy
ìì ìì ì¬ì© ì¬ë¶ì ë°ëŒ ë€ëŠ
ëë€.
@fergaldoyle ëë ìŽê²ì ì¡°êž ê°ì§ê³ change
ìŽë²€ížë¥Œ ì
ë ¥(ì: https://jsfiddle.net/cynhtLty/1/) ì ë°ìžë©íŽìŒ í©ëë€.
@calebboyd
https://jsfiddle.net/Linusborg/z0nyfba0/1/
enter-active-class
ë° leave-active-class
륌 ì¬ì©íŽìŒ í©ëë€.<router-view>
ììì class="animated"
륌 ë£ìŽìŒ í©ëë€.@fergaldoyle 1.0 묞ìì ë°ë¥Žë©Ž, ëŽê° ê°ì§ ìê° lazy
, V-ëªšëž ê² ëšì§ì ë°ì change
ëì input
. ìŽê²ì ì¬ì©íì¬ ëìì ë³ê²œíê³ input
ëë change
륌 ëŽë³ŽëŽ lazy
ê° ì ê³µëëì§ ì¬ë¶ì ë°ëŒ ë€ë¥ž 결곌륌 ì ê³µí ì ììµëë€.
ê°ëší v-for
ìì 륌 ê°ì§ê³ ëë©Žì 뚞늬륌 êžì value
ë°ìžë©ìŽ 2.0ì select
ììì ëíŽ ìëíì§ ììµëë€: https://jsfiddle.net/972eL5fL/
ëí "i in 10"
ì ê°ì v-for ë²ìë 1.0ììì ê°ìŽ 0 ëì 1ìì ììíë€ë ì ì ì ìíŽìŒ í©ëë€.
@lauritzen
ì륌 ë€ìŽ ê°ëší v륌 ê°ì§ê³ ëë€ê° 뚞늬륌 êžì ììµëë€. ìŽë€ ìŽì ë¡ ê° ë°ìžë©ìŽ 2.0ì ì í ììì ëíŽ ìëíì§ ììµëë€: https://jsfiddle.net/972eL5fL/
ììëë¡ ìëíë ê² ê°ìµëë€. 묎ììŽ ìëíì§ ììµëê¹?
vm.$getìŽ ë ìŽì ì¬ì©ëì§ ìë ìŽì ë 묎ìì
ëê¹?
ëì Vue.getì ì¬ì©íì§ ìë ìŽì ë 묎ìì
ëê¹?
ë€ì곌 ê°ìŽ ê³ì°ë ííìì íê°íë ë° ë§€ì° ì ì©í©ëë€.
var exp = 'entity.type.name' // this is generated in runtime
return vm.$get(exp)
@iagafonov ìŽê²ìŽ ì ì©í ìë늬ì€ë ë§ì§ ììŒë¯ë¡ íµì¬ì ìŒë¶ê° ìëìŽìŒ í©ëë€.
ëª ê°ì§ ìëëŠ¬ì€ ì€ íëì ëí êž°ë¥ìŽ íìí ê²œì° lodash륌 ì¬ì©íì¬ ì ì¬í ëìì ë§€ì° ìœê² ì¶ê°í ì ììµëë€.
import get from 'lodash/get';
Vue.prototype.$get = get
//in any component
var value = this.$get(this.someObject,'some.path.to.value')
(ë¬Œë¡ Vue.get()곌 ê°ì "íŽëì€ ë©ìë"ë¡ ì¶ê°í ìë ììµëë€. ëë íìí ë ë¡ì»¬ë¡ ê°ì žì¬ ìë ììµëë€. ì í)
@ëŒìŽëì€ë³Žê·ž. ì°ì , ëë lodash ëë ìŽì ì ì¬í ê²ì ì¬ì©íì§ ììµëë€.
ë ë²ì§žë¡ lodash 구íì ë°íìì íí 구조륌 ê¹ììŽ ë³Žë €ê³ íêž° ë묞ì ë늜ëë€. vueë ë²ìì ë°ìžë©ë ìë¡ ì§ì ë íšì(parseExpressionì ìíŽ)륌 ì€ìí©ëë€.
ìŽê²ì ì¬ìí ë¶ë¶ìŽ ìëë©° ìŽê²ì ë€ì 구ííë ê²ì ë§€ì° ìŽë µìµëë€.
ë¬Œë¡ $get compile íšìë ë§€ë² ). ì륌 ë€ìŽ parseExressionìŽ Vue.utilìì apiì ìŒë¶ìŽë©Ž ì¢ì ê²ì
ëë€.
@iagafonov this.$get
ëí ë°íìì 겜ë¡ë¥Œ 구묞 ë¶ìíê³ ê°ì ëì ìŒë¡ ê²ìíŽìŒ í©ëë€. ê·žë ì§ ììŒë©Ž 겜ë¡ê° ì¡Žì¬íì§ ììŒë©Ž ì€ë¥ê° ë°ìí©ëë€. ëí ì±ë¥ ì°šìŽë ëë¶ë¶ì ê²œì° ë¬Žìí ì ììµëë€. lodash륌 ìíì§ ìëë€ë©Ž ë€ë¥ž ê²œë¡ ê²ì ëŒìŽëžë¬ëŠ¬ê° ë§ìŽ ììµëë€. ê·žê²ì ë ìŽì Vueì êŽì¬ì¬ê° ìëëë€.
ìŽì ë ìŽì ì¬ì©ëì§ ìë param ìì±ì ëí ëìì 묎ìì ëê¹?
ì§ì묞ìì paramsì ëíŽ ìŽìŒêž°íê³ ììµëê¹? ê·žë° ë€ì vnode ê°ì²Ž ëŽìì 몚ë ë°ìžë©ë ìì±ì ì°Ÿì ì ììµëë€.
<button v-test="123" color="red" type="button">click me</button>
bind (el, binding, vnode) {
// vnode.data.attrs -> { color: 'red' }
}
@sqal , ìŽê²ì ëŽ ì§ë¬žì ëí ëµë³ì
ëê¹? ê·žë ë€ë©Ž lazy, number, debounceì ê°ì param ìì±ì ëíŽ ìŽìŒêž°íë ê²ì
ëë€. ì륌 ë€ìŽ 2.0 ìŽì ìë <input type="text" v-model="msg" number>
(ì«ìë ì¬êž°ìì 맀ê°ë³ì ìì±ì)륌 ìíí ì ìììµëë€. param ìì±ì ì¬ì©íì§ ìê³ ìŽë»ê² ê°ì 결곌륌 ì»ì ì ììµëê¹?
@p-adams ê²ì묌ì ìžêžëìŽ ììµëë€. ìŽì ìì ìì
ëë€. <input v-model.number="msg">
Vue 2.0ììë propsê° ë³ê²œë ë render íšìê° íì ížì¶ëë€ë ê²ì ë°ê²¬íìµëë€. ê·žëì 2.0ìŽ ë€ì ë ëë§í ì§ ì¬ë¶ë¥Œ ê²°ì íêž° ìíŽ shouldComponentUpdate
륌 ì§ìíëì§ ê¶êží©ëë€.
@yyx990803 ì¢ìì, ìŽì The lazy and number params are now modifiers
ê²ì묌ìì 볌 ì ììµëë€.
@HeChenTao Evanì https://medium.com/the-vue-point/announcing-vue-js-2-0-8af1bde7ab9#.pc5c8urbvìì ìŽê²ì ì¡°êž ì€ëª íìµëë€.
@HeChenTao ë ëë§ êž°ë¥ì "íì" ížì¶ëì§ ìê³ íìí ëë§ ížì¶ë©ëë€.
shouldComponentUpdate
íìíì§ ììµëë€.mobxì ë°ìíì¬ ëìŒí ìì
ì ìíí ì ììµëë€. shouldComponentUpdate
륌 구íí íìê° ìë€ê³ íì í©ëë€. ê·žë¬ë vueì ë§ì°¬ê°ì§ë¡ mobxë ë³ê²œ ê°ë¥í ìí륌 죌ì¥í©ëë€. ìŽë€ ìŽì ë¡ ë¶ë³ ìí ê°ë
ì ëìíë€ë©Ž. ìŽ ê²œì° ë°ìì shouldComponentUpdate
ë±ì ë늜ëë€.
ê·žë ë€ë©Ž ëêµ°ê°ê° ë¶ë³ ìí륌 죌ì¥íë©Ž vueê° ì ìŽìžëŠ¬ì§ ìëë€ë ë»ì ëê¹?
êž°ë¥ êµ¬ì± ììì 컚í
ì€íž ìžììë children
+ slots
ììµëë€. children()
ì slots().default
ê° ì íí ëìŒíë€ë ì¬ì€ìŽ ìœê° íŒëì€ëœìµëë€. ì¬ë°ë¥ž ì ê·Œ ë°©ììŽ ë¬Žììžì§ ê¶êží©ëë€. ìë§ë ì¬ë¡¯ìŒë¡ìì 'ìì'ì ê²ìŒë¥Žì§ë§ ì¬ì í ëìŒí ëìì ì»ë ë ê°ì§ ë€ë¥ž ë°©ë²ì ì§ìíë ìŽì ë 묎ìì
ëê¹?
êž°ë¥ êµ¬ì± ììë êž°ë¥ìŒ ë¿ìŽë¯ë¡ ìììŽ ììµëë€. IMHO, ììŽë€ì ë ìŽì ì¬ì©ëì§ ììŒë©° ì¬ë¡¯ì ê²ìŒë¥Žì§ ìëë¡ ì ì§íŽìŒ í©ëë€.
@blocka mobx ì ë°ìíì¬ ë°ì ë°ìŽí°ë¥Œ 구íí ì ììµëë€. ê·žë¬ë ë°ìì±ì Vue êž°ë¥ì íµì¬ì ëë€. ê·žëì ê·žê²ìŽ ìêž° ì°š íììŽ ìëëŒë©Ž, ê·ž ì¬ëì ì못ë íí°ì ìë ê²ì ëë€.
@miljan-aleksic children
ë ìì(ìŽë€ ì¬ë¡¯ì ë€ìŽê°ìŒ íëì§ì êŽê³ììŽ ëªšë ë
žë륌 ì»ì)ìŽê³ slots
ë ë€ìŽì€ë ììì slot
ìŽëŠì êž°ë°ìŒë¡ íŽê²°ë©ëë€.
@yyx990803 ê°ì¬í©ëë€. 묞ììì ìŽì ëí ììží ëŽì©ì @chrisvfritzì íŒëì íŒí ì ììµëë€.
@ miljan-aleksic ë©ëªš ì¶ê°íê² ìµëë€. ð
íí°ì êŽë šíì¬ ê³ì°ë ìì±ì ì¬ì©íë ê²ì ê°ëšíŽ 볎ìŽì§ë§ v-몚ëžê³Œ íšê» íí°ë¥Œ ì¬ì©íë 겜ì°ë¥Œ ì²ëŠ¬íë ë°©ë²ì ëë€. ì ë ¥ íëì ì ë ¥íì¬ ìŽëŠ 목ë¡ì íí°ë§íë €ë©Ž 2.0ìì ìŽë»ê² íŽìŒ í©ëê¹?
ë°ìŽí° íë/ê³ì°ë ìì±ìŽ í í늿ìì ì¬ì©ëì§ ìì ë Vueê° ê²œê³ íëë¡ íë ê²ì ëí ìê°ì? ì¬êž°ì ëª ê°ì§ ì í ì¬íìŽ ìë€ê³ ìê°íì§ë§ íìíì§ ìì ìŒë¶ ìžëªšìë ìì ê°ì žì€êž°ë¥Œ êºŒëŒ ì ìë ê³³ì ìë ê²ìŽ ë§€ì° ëììŽ ë ê²ì ëë€.
@yyx990803 , Component íë¡í íì
ì ëí $context
찞조륌 ì€ì íë ê²ì ëíŽ ìŽë»ê² ìê°íìëê¹? $parent
ëë $root
ë§ì°¬ê°ì§ë¡ íì¬ $vnode
ê°ì²Žë¥Œ íµíŽìë§ ì¬ì©í ì ìë 컚í
ì€ížì ì죌 ì¡ìžì€íë ìì ì ë°ê²¬íìµëë€.
ì€ì ë¡ ì»ší ì€ížì ì¡ìžì€íë ì 뢰í ì ìë ë°©ë²ì ìë ê² ê°ìµëë€. ìŽë»ê² íŽìŒ í©ëê¹?
@miljan-aleksic 컚í ì€ížì ì죌 ì¡ìžì€íë ì¬ì© ì¬ë¡ë¥Œ ê³µì í ì ììµëê¹?
@Kingdaro ê·žê²ì ëí 묞ì 륌 ìŽ ââì ììµëê¹? ì€í ê°ë¥íë©Ž ì¢ì ê² ê°ìµëë€.
@p-adams Array.prototype.filter
ì íšê» ê³ì°ë ìì±ì ê³ì ì¬ì©í ì ììµëë€.
@chrisvfritz , Ʞ볞ì ìŒë¡ ì륌 ë€ìŽ ìììŽ êž°ëíë 컚í ì€ížìì ë³ì륌 ì€ì íë ê²ê³Œ ê°ì íŽê²° ë°©ë²ì ëë€. ëë Vue ìì²Žê° ìííë ê²ë³Žë€ 뚌ì êµ¬ì± ììì ëí 찞조륌 ì€ì í©ëë€.
몚ë ì¬ëìê² ê³µíµì ìž ê²ì ìëì§ë§ ì ìŽë êµ¬ì± ìì ëŽìì ì¡ìžì€í ì ìë ì 뢰í ì ìë ë°©ë²ìŽ ììŽìŒ íë€ë ë° ëìí©ëë€. $vnodeë í í늿ì ì¬ì©í ë êµ¬ì± ììê° ë§ìŽížë ëê¹ì§ ì¡Žì¬íì§ ììµëë€(ì ìŽë ì§êžê¹ì§ë ëŽ ê²°ë¡ ).
ì ì í ë°©ë²ìŒë¡ ì¡ìžì€íë ë°©ë²ì ìê³ ììŒë©Ž ë§ì¡±í ê²ì ëë€.
$context
ê° ì ì©í ë ë€ë¥ž ìí©ì êµ¬ì± ìì륌 ë€ë¥ž êµ¬ì± ììì 룚ížë¡ ì¬ì¬ì©í ëì
ëë€.
<template>
<Foo>
<child/>
</Foo>
</template>
<script>
{ name: 'Bar' ... }
</script>
ìì ìì child.$parent
ë Bar ëì êµ¬ì± ìì Foo륌 ë°íí©ëë€. ìŽë ì ííì§ë§ ë¶ëªšì ìììŽ ìë¡ ì¢
ìëìŽ ìë ê²œì° ì»ší
ì€ížë¥Œ íµíŽ ì§ì íµì í ì ììµëë€.
@miljan-aleksic ìŽê²ì @yyx990803ì ë§¡êž°ê² ìµëë€. ë ê·žë¥ì ê°ì ê·ž ë§ì $parent
ëë¬, $context
ìë§ ìê°ì ì못ë ë°©í¥ìŒë¡ 99.9 %ê° ë ê²ìŽë©°, ëë ìë§ ê·žê²ì ì¬ì©íì§ ìì ê±°ëŒê³ ìê°í©ëë€.
v-show
ë° ì íìŽ ìë ìí©ìŽ ììµëë€. ìŽ ìë늬ì€ìë CSSìì Ʞ볞ì ìŒë¡ 'ëì€íë ìŽ: ìì'ìž ëªšë¬ìŽ ììµëë€. v-show
ì ê²°í©íë©Ž ì§ìë¬žìŽ display ìì±ì ì ê±°íê³ CSS ìì±ìŽ ì ì§ëêž° ë묞ì íìëì§ ììµëë€. CSS(íë¡ì íž ì구 ì¬í)륌 ë³ê²œí ì ììŒë©° Vue ì íìŽ í¹ë³í ìì¡Žíë ê²ì²ëŒ 볎ìŽë¯ë¡ ì¬ì©ì ì§ì ì§ì묞ì ì¬ì©í ì ììµëë€.
ìŽì v-show ì§íì íê°ëë ì§ìë¬žìŽ display ìì±ì blockìŒë¡ ì€ì í ì ìë€ê³ ìê°í©ëë€. ê·žê²ì ìëíŽìŒ íì§ë§ ìŽìšë v-showì ìì ì륌 ì¶ê°íì¬ ëì€íë ìŽë¥Œ ì°šëš ëë ìžëŒìž ì°šëšìŒë¡ ì€ì í ì ìëë¡ íë ê²ìŽ ì¢ìµëë€. ê·žë¥ ìê°.
@chrisvfritz , êž°ë¥ êµ¬ì± ììì ê²œì° ë¶ëªš ì°žì¡°ê° ì¬ë¡¯ìŒë¡ ì¬ì©ëë ì§ê³ ë¶ëªšê° ìëëŒ ì»ší ì€íž êµ¬ì± ììê° ëìŽìŒ í©ëë€.
2.0.0-beta7ìì "<"(ë° êž°í HTML êµ¬ë¶ ë¬žì)ê° í¬íšë ê²œì° í í늿 컎íìŒìŽ ì€íší©ëë€.
https://jsfiddle.net/x0r59ur1/
ìŽê²ì 1.0.26ìì ìëíìµëë€.
"<"륌 "<"ë¡ ìŽì€ìŒìŽííë©Ž 묞ì ê° íŽê²°ë©ëë€.
@GlurG "<"륌 ì¬ë°ë¥Žê² ìŽì€ìŒìŽííŽìŒ í©ëë€.
@yyx990803 , ê°ì ì íì êµ¬ì± ìì 목ë¡ìì ì íì ì¬ì©íê³ ìí륌 ì ì§íë €ë©Ž ìŽë»ê² íŽìŒ íëì? 묞ì륌 ë°ë¥Žë©Ž êµ¬ì± ììê° ë€ë¥ž 겜ì°ìë§ ë³Œ ì ììµëë€.
í êµ¬ì± ììì íŽë¹ í목ì ì ííë€ê³ ê°ì íŽ ë³Žê² ìµëë€. êžžì ëª»ì°Ÿê² ìŽì :(
<tabs>
<transition>
<tabs-item>Content 1</tabs-item>
<tabs-item>Content 2</tabs-item>
<tabs-item>Content 3</tabs-item>
<transition>
</tabs>
@miljan-aleksic <transition>
ë ëšìŒ ìì ì ì©ì
ëë€. ì¬ë¬ í목ì ëíŽ <transition-group>
íìí©ëë€.
@ yyx990803 ,
@yyx990803 , @LinusBorg ëìì ê°ì¬íì§ë§ íŽê²°ì±
ìŽ ëª
ííì§ ììµëë€. ì íìŽ ìŽë»ê² ì ì©ëëì§ ìê³ ìëë°, ì íë êµ¬ì± ìì륌 keep-alive
íë ë°©ë²ì ì ì ììµëë€.
êµ¬ì± ììê° ë§€ë² ìì±ëë ë°©ìì ëí jsfiddle ìì 륌 íµíŽ ëª íì±ì ìíŽ ìë¡ìŽ 묞ì 륌 ë§ë€ììµëë€.
@yyx990803 , ì°ê²° ì ì§ êž°ë¥ì ê°ì íŽ ì£Œì ì ê°ì¬í©ëë€. ìŽì ììëë¡ ìëí©ëë€.
ë¹ì ì ë§ ê·žëë¡ ëŽ ì¶ì ë°êŸžê³ ììµëë€. ë¹ì ì ì í곌 ì§ì ì€ëŠ¬ë¥Œ íµíŽ ëë ì€ë«ëì ëêž° ìíì ìë ì íì ë°°ì°ê³ ë§ë€ê³ ì ë¬í ì ììµëë€. Keep it simple ì ê·Œ ë°©ìì íµíŽ 몚ë ì¬ëìŽ ì¬ì©íê³ êµ¬ì¶í ì ìë ì²šëš êž°ì ì ì¬ì©í ì ììµëë€. ê·ž 몚ë ê²ì ëíŽ ëë ììí ê°ì¬í©ëë€.
@ miljan-aleksic Patreon ìº íìž ìí¬ ìí¬ê° ììµëë€.
@phanan , ë¹ì ìŽ ìì í ì³ë€ë ê²ì ìê³ ììµëë€. ì ë ê°ìžì ìŒë¡ Evanì ì§ìíêž° ììíìŒë©° íì¬ ì íìŽ ììëë ìŠì ì§ììŽ ë ëì ëê² ë ê²ì ëë€.
ready
ìëª
죌Ʞ íí¬ë ë ìŽì ì¬ì©ëì§ ììŒë©° mounted
; ê·žë¬ë ë³ê²œ ë¡ê·žì ë°ë¥Žë©Ž ë§ìŽížê° ížì¶ëêž° ì ì êµ¬ì± ììê° ë ëë§ëë€ë 볎ì¥ì ììµëë€. êµ¬ì± ììê° ìŽêž°íë í í¹ì jquery êµ¬ì± ìì(ì: selectize)륌 ìŽêž°ííë €ê³ í ë ì°ë°ì ìž ì€ë¥ê° ë°ìí©ëë€. ëì ìŽë€ ìëª
죌Ʞ íí¬ë¥Œ ì¬ì©íŽìŒ í©ëê¹? "ì€ë¹ë" íí¬ë¥Œ ë€ì곌 ê°ìŽ ì뮬ë ìŽíží ì ììµëê¹?
function mounted() {
Vue.nextTick(() => {
//...
});
}
@GlurG ì, ìëí©ëë€. 귞걎 ê·žë ê³ , ê·žê²ì ë§ì 겜ì°ì 1.0ìì ready'()
ì íšê» íìíìµëë€.
ìŽê²ì êŽê³ììŽ íí¬ê° ìì ìŽì ê° ììµëê¹? ëë
ìŽê²ì ê±žì³ ... 1.0ììë rafë¡ ë°ë³µíë ê²ê³Œ ê°ì ê²ì ìì§íìµëë€.
ë ë±ì ìëì§ íìžíììì€.
2016ë
8ì 10ìŒ ì€í 6ì 26ë¶, "Thorsten LÃŒnborg" [email protected]
ìŒë€:
@GlurG https://github.com/GlurG ì, ìëí©ëë€. ê·žë°ë°,
ê·žê²ì ëí ë§ì 겜ì°ì 1.0ìì ready'()ì íšê» íìíìµëë€.â
ë¹ì ìŽ ìžêžëìêž° ë묞ì ìŽê²ì ë°ë ê²ì ëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê³ GitHubìì íìžíìžì.
https://github.com/vuejs/vue/issues/2873#issuecomment -238903012 ëë ììê±°
ì€ë ë
https://github.com/notifications/unsubscribe-auth/AACounAoI8p65soUUUrbdaiwteDXKgMGJks5qee25gaJpZM4IedHC
.
ë ë êž°ë¥ì ì¬ì©í ë íµì¬ ì§ì묞ì 묎ìëë©° ìŽë í©ëŠ¬ì ì
ëë€. ê·žë¬ë ìŒë¶ë ìŒë° js륌 ì¬ì©íì¬ ì¬ííêž°ê° ìœì§ ììµëë€. v-model
ë IE9ì ëí íŽê²° ë°©ë²ìŽ ìê³ ìë§ë ë€ë¥ž ì£ì§ ìŒìŽì€ 묞ì 륌 íŽê²°í ê²ì
ëë€.
ëì í í늿 ì¬ì©ì ì¬ê³ íê² ëì§ë§ ìŒë¶ ìí©ììë ë¶ê°ë¥íê±°ë ìµì ì ì íì ëë€. 묞ìë ìŽ ì£Œì ì ëíŽ ë ë§ì ì§ì¹šì ì ê³µí ì ììŒë©°, ê²ë€ê° ìŽë¬í ìŒë°ì ìž ìí©ì íŽê²°íê³ í í늿ì ëì¹ì§ ìëë¡ ëìì€ ë ë êž°ë¥ìŒë¡ ìì í ë ëì°ë¯žë¥Œ ëë ê²ìŽ ì¢ìµëë€.
@miljan-aleksic ì£ì¡í©ëë€. v-show ëë ì¬ì©ì ì§ì ì§ì묞ììë§ ìëíë€ë ê²ì ììêž° ë묞ì ëŽ ì견ì ìì íìµëë€. ì, v-modelì ê²œì° ë§ìíì ê²ì²ëŒ ì ë ¥/ë³ê²œ ìì Ʞ륌 ì¶ê°íê³ ë°ìŽí°ë¥Œ ìëìŒë¡ ì ë°ìŽížíŽìŒ í©ëë€.
ìž ìë¡ìŽ activated
겜ë¡ê° íì±í ë / ë§ìŽíž ⢠귞ëë ë°ì¬ ë ë ížì¶ ë ìì íí¬ router-view
? íì¬ ìŽ ëììŽ íìëì§ ììµëë€.
@wprater ìëì, <keep-alive>
ìë§ êŽë šëë©° ë€ë¥ž ê²ì ììµëë€.
@ yyx990803 ëŒì°í° 볎Ʞ륌 ì°ê²° ì ì§ë¡ ëííê³ ìì§ë§ ìŽì ë³Žêž°ë¡ ë€ì ëŒì°í
í ë íí¬ë¥Œ ì°Ÿì ì ìë ê² ê°ìµëë€. mounted
ëë activated
ê° ížì¶ë©ëë€. ëìŽ ë ëë§ëìëì§ íìžíŽìŒ í©ëë€.
@wprater êŽë š ìë ì§ë¬žìë ìŽ ì€ë ë륌 ì¬ì©íì§ ë§ììì€. ë²ê·žê° ìë ê²œì° íŽë¹ repoì 묞ì 륌 ì êž°íì¬ ì¬ìì°í©ëë€.
Vue JSXë ê°ì²Ž íì° ì°ì°ì륌 ì§ìí©ëê¹? ëë ê·žê²ì ìëíì§ë§ ìëíì§ ììµëë€.
@yyx990803 ì ìëíëë¡ ë§ì ë žë ¥ì êž°ìžììµëë€.
ëë ìŽê²ì <Component {...{ props } }></Component>
íê³ ììŒë©° 묞ìíë ëë¡ ìëí©ëë€.
@blocka ê°ì¬í©ëë€! ìì±ëª
props
ë íììë€ê³ ìê°íëë° ð
@yyx990803
components
ìµì
ì ë°°ìŽ ì íì ì§ìíì§ ìì§ë§ 1.xìì ìëí©ëë€.
ì
var Parent = Vue.extend({
name: 'parent',
template: '<div><slot></slot></div>'
})
var Child = Vue.extend({
name: 'child',
template: '<span>hello</span>'
})
new Vue({
el: '#app',
components: [
Parent,
Child
],
replace: false,
template: '<parent><child></child></parent>'
})
ë²ê·žìŒ?
@QingWei-Li ê³µìì ìŒë¡ 묞ìíë êž°ë¥ìŽ ìëêž° ë묞ì ë ìŽì ì§ìëì§ ììµëë€. ê·ž ìŽì ë ES2015ììë components: { Parent, Child }
ë§ ìì±í ì ìêž° ë묞ì
ëë€.
ìì ì ì,
v-foreach
íê³ ë²ìì ëíŽ v-for
ì¬ì©íë ìŒë° ë°°ìŽ ë°ë³µì ëí êž°íê° ììµëê¹?
ìŽê²ì PHPìì ì€ë ì¬ì©ììê² ë ìë¯žê° ìê³ JQì .each
ëë JSì foreach
ìë ìŒì¹í©ëë€.
@ctf0 ì°ëŠ¬ë RC ëšê³ì ììŒë©° APIë ë ìŽì ë³ê²œëì§ ììµëë€. ê·žëŠ¬ê³ ì°ëŠ¬ë ê°ì ìŒì íêž° ìí ë첎 구묞ë ìê°íì§ ìì ê²ì ëë€.
ëë v-for="item in items"
ì ì ì ì ì€ë²í€ëê° ê·žê²ì 볎ìŠí ë§íŒ 충ë¶í ì€ìíë€ê³ ìê°íì§ ììµëë€.
ìŽ ì ë²ì ìŒë¡ ìŽ ê²œì°ë¥Œ ì²ëŠ¬íê² ìµëë€.
ëë ê³ ì ì ìž í ì€íž ì ë ¥ì ì¬ì©íê³ ë ì§ë¥Œ ì¬ë íì(ì: "2016ë 7ì 10ìŒ")ìŒë¡ íìíë ë¬ë ¥ êµ¬ì± ìì(ìë§ší± uiìì ê°ì žìŽ)륌 ê°ì§ê³ ììµëë€. v1.0ììë ìë°©í¥ íí°ë¥Œ ì¬ì©íì¬ íŽë¹ 묞ììŽì ì ì í ë ì§ë¡ ë³ííì¬ ê°ì²Ž ë°ìŽí°ë¥Œ ë°ë¡ ì ì¶í ì ìëë¡ íìµëë€. ê·žë¬ë íí°ê° v-modelìì ë ìŽì ìëíì§ ìêž° ë묞ì v2.0ìì ìŽë»ê² ëìŒí ìì ì ìíí ì ììµëê¹?
ê°ì¬ íŽì
@shadowRR ìŒë¶ ìœë륌 볌 ì ììµëê¹?
@p-adams ë¬Œë¡ ì ëë€. ì¬êž° ììµëë€.
뚌ì ëŽ ë¬ë ¥ ì ë ¥ì ìíŽ ëŽ v-몚ëžìì ì¬ì©íë ëŽ íí°ì ëë€. ì ìŒí 목ì ì ê°ìŽ ë³ê²œë ë ëŽ ë°ìŽí°(postgres ë ì§)ì ì ì í ë ì§ ì íì ìì±íë ê²ì ëë€.
Vue.filter( 'formatDate', {
read( date ) {
return date;
},
write( date ) {
if( !date ) return null;
return moment( date, 'D MMMM YYYY' ).format( 'YYYY-MM-DD' );
}
} );
ëŽ êµ¬ì± ìììì ìŽì ê°ìŽ ì¬ì©íìê² ìµëê¹(ì ë ¥ìë ì¬ëìŽ ìœì ì ìë íììŒë¡ ëŽ ë ì§ë¥Œ ë°ííë ë¬ë ¥ ìì€í ìŽ ììµëë€)
<div class="required field">
<label>Start date</label>
<div class="ui calendar">
<div class="ui input left icon">
<i class="calendar icon"></i>
<input v-model="section.start | formatDate" type="text">
</div>
</div>
</div>
https://github.com/vuejs/vue/issues/2756 ìì @yyx990803 ì ê²ì묌ì ìœë ê²ìŽ ì¢ìµëë€. ì¬êž°ì ê·žë v-model
ì ëí ìë°©í¥ íí°ì ëíŽ ì€ëª
í©ëë€. ëí ë€ì곌 ê°ì ì§ë¬žì íë ê²ìŽ ì¢ìµëë€. http://forum.vuejs.org/
ë§ìíì êžì ëì³€ë€ì.. ì ë³Žê² ìµëë€. ê°ì¬í©ëë€ ;)
ìë
,
ìë¡ìŽ ëŒìŽí ì¬ìŽíŽ íí¬ì ëíŽ ëª ê°ì§ ìì¬ìŽ ììµëë€.
ë§ìŽíží ë ìŽë²€íž ížë€ë¬ë¥Œ ë±ë¡íê³ ë§ìŽíž íŽì íêž° ì ì ë±ë¡ì ì·šìíë €ë©Ž ìŽë»ê² íŽìŒ íëì? ìì±ë & beforeDestroy íí¬ì ê²ì¬ ë° ë
ŒëŠ¬ë¥Œ ì¶ê°íìê² ìµëê¹?
Vue 1.xììë ë¶ì°© ë° ë¶ëŠ¬ íí¬ë¥Œ ì¬ì©í©ëë€.
ê·žë¬ë 2.0ìë ë§ìŽížë íí¬ê° ìì§ë§ ë§ìŽíž íŽì íí¬ë ììµëë€. ìœê° ìŒì¹íì§ ìë ëë.
ë§ìŽíž íŽì íí¬ê° ì ê³µëì§ ìë ìŽì ê° ììµëê¹?
@f15gdsy mounted
ë destroyed
í©ëë€. 2.0ìë attached
/ detatched
칎ìŽí° ë¶íìŽ ììµëë€. ë ëŽë¶ìì ì§ì íìžíŽìŒ í©ëë€. ìŽë²€ížê° ë ëŽë¶/ì€í ëì ëíŽ êŽì¬ìŽ ìë€ë©Ž mounted
ë° beforeDestroy
ê° ì ì í ì¥ìì
ëë€.
ì¬ì©ì ì ì êµ¬ì± ìììì ì¬ì©ë ë v-onì ìŽì íŽë¹ êµ¬ì± ììì ìíŽ $emitë ì¬ì©ì ì ì ìŽë²€ížë§ ìì í©ëë€. (ë ìŽì DOM ìŽë²€ížë¥Œ ìì íì§ ìì)
ì¬êž°ìì ëª ê°ì§ ê²ì묌ì ëì³€ì ì ìì§ë§ ìŽ ìŽë©Žì ëììž ê²°ì ì 묎ìì
ëê¹?
êµ¬ì± ììì ëí ê°ëší íŽëŠ ìŽë²€íž ë°ìžë©ì ë§€ì° ì¥í©íê² ë§ëëë€.
1.0:
<foo @click="bar"></foo>
2.0:
<div @click=bar>
<foo></foo>
<div>
@fnlctrl , Ʞ볞 ìì ì륌 ì¬ì©íììì€: @click.native="bar"
.
@miljan-aleksic ì ë§ ê°ì¬í©ëë€! ìŽ ìì ìë ìŽ ë¬žì ìì Directives
-> v-on
-> modifiers
ì ì¶ê°ëìŽìŒ íë€ê³ ìê°í©ëë€.
Koa(1.x ëë 2.x)륌 ìë²ë¡ ì¬ì©í ì ììµëê¹? Koaìì vue-server-renderer
ì 묞ì ê° ììµëê¹?
@yyx990803
import Vue from 'vue'
Vue.component('expanding', {
functional: true,
render (createElement, { children }) {
const data = {
props: {
name: 'expanding',
},
on: {
beforeEnter ($el) {
$el.classList.add('collapse')
console.log('beforeEnter')
},
enter ($el) {
$el.classList.remove('collapse')
$el.classList.add('collapsing')
$el.style.height = `${$el.scrollHeight}px`
console.log('enter')
},
afterEnter ($el) {
$el.classList.remove('collapsing')
$el.classList.add('collapse', 'in')
console.log('afterEnter')
},
beforeLeave ($el) {
$el.classList.add('collapsing')
$el.classList.remove('collapse', 'in')
$el.style.height = 0
console.log('beforeLeave')
},
leave ($el) {
console.log('leave')
},
afterLeave ($el) {
$el.classList.remove('collapsing')
$el.classList.add('collapse')
$el.style.display = 'none'
console.log('afterLeave')
}
}
}
return createElement('transition', data, children)
}
})
<a href="#" :aria-expanded="showItem ? 'true' : 'false'" @click="showItem = !showItem">
<span class="icon is-small"><i class="fa fa-table"></i></span>
Tables
<span class="icon is-small is-angle"><i class="fa fa-angle-down"></i></span>
</a>
<expanding appear="true">
<ul v-show="showItem">
<li>
<router-link to="/tables/basic">Basic</router-link>
</li>
<li>
<router-link to="/tables/handsontable">Handsontable</router-link>
</li>
</ul>
</expanding>
Enter íí¬ë¥Œ ížì¶íì§ ìë ìŽì ë 묎ìì ëê¹?
@fundon í¬ëŒ ìŽë gitter ì±í ì ì§ë¬žíŽìŒ í©ëë€.
ìŽ ì€ë ë륌 ì ê·žë ìŽì ë ë€ì곌 ê°ìµëë€.
ë²ê·žê° ìë 겜ì°ìë ìŽì ë³Žê³ ê°ìŽëì ë°ëŒ ë³ëì ìŽì륌 ìŽìŽì£Œìê³ , ê¶êží ì¬íì í¬ëŒìŽë ì§í°ë¥Œ ìŽì©íŽ 죌ìžì.
ì ë°ìŽíž : 2.0ì ë³ê²œ ì¬íì ëí ë³Žë€ ëª ííê³ ììží 목ë¡ì ì ë§ìŽê·žë ìŽì ê°ìŽë륌 ì°žì¡°íìžì.
ê°ì¥ ì ì©í ëêž
@chrisvfritz @Uninen ìì : Vuex 2.0ì Vue 1.xììë ìëí©ëë€.
vue-router
ì ë€ì 죌ì ë²ì ì Vue 2.xë§ ì§ìí©ëë€.