Vue3变量声明实战:5个常见场景教你选ref还是reactive
鍝庡鍛€锛佹渶杩戞€昏闂柉锛?ref鍜宺eactive鍒板簳鍜嬮€夊晩锛? 馃く 浠婂ぉ鍜变滑涓嶆暣铏氱殑锛岀洿鎺ヤ笂5涓湡瀹炲紑鍙戝満鏅紝鎵嬫妸鎵嬫暀浣犲仛閫夋嫨锛佷繚浣犵湅瀹屽氨鑳介棴鐪煎啓浠g爜锛侊紙鎷嶅ぇ鑵夸繚璇侊級
馃洅 鍦烘櫙涓€锛氱櫥褰曡〃鍗曠粦瀹氾紙input妗嗭級
鈥?strong>鈥?鐢ㄦ埛璐﹀彿瀵嗙爜杈撳叆鐢ㄥ摢涓紵"鈥?/strong>鈥?杩欎簨鍎挎垜韪╄繃鍧戯紒鍘诲勾鍋氫釜鐧诲綍椤碉紝褰撴椂鍌讳箮涔庣敤reactive锛?/p>
javascript澶嶅埗const form = reactive({ username: '', password: '' })
缁撴灉鍦ㄦā鏉块噷瑕佸啓v-model="form.username"
锛屾瘡娆¢兘瑕佸鎵?涓瓧姣嶏紒馃挗
馃憠 鈥?strong>鈥嬫纭Э鍔库€?/strong>鈥嬶細
javascript澶嶅埗const username = ref('') const password = ref('')
鉁?鈥?strong>鈥嬩负鍟ラ€塺ef鈥?/strong>鈥嬶細
- 鍗曚釜瀛楁鐙珛绠$悊鏇存竻鐖?/li>
- 妯℃澘鐩存帴
v-model="username"
- 閬垮厤瀵硅薄瑙f瀯鏃剁殑鍝嶅簲寮忎涪澶?/li>
馃摝 鍦烘櫙浜岋細璐墿杞﹀晢鍝佸垪琛?/h3>
鈥?strong>鈥?鍟嗗搧鍒楄〃瑕佸鍒犳敼鏌ョ敤鍟ワ紵"鈥?/strong>鈥?杩欓噷鏈変釜琛€娉暀璁紒涔嬪墠鐢╮ef瀛樻暟缁勶細
javascript澶嶅埗const cartList = ref([]) // 娣诲姞鍟嗗搧鏃?.. cartList.value.push(newItem) // 椤甸潰灞呯劧涓嶆洿鏂帮紒
馃槺 涓哄暐锛熷洜涓簉ef瀵规暟缁勭殑娣卞眰鍙樻洿涓嶆晱鎰燂紒
馃憠 鈥?strong>鈥嬫纭墦寮€鏂瑰紡鈥?/strong>鈥嬶細
javascript澶嶅埗const cartList = reactive([]) // 鐩存帴鎿嶄綔鏁扮粍 cartList.push(newItem) // 椤甸潰绉掓洿鏂?/span>
鉁?鈥?strong>鈥嬮€塺eactive涓夊ぇ鐞嗙敱鈥?/strong>鈥嬶細
- 鐩存帴鎿嶄綔鏁扮粍涓嶇敤.value
- 娣卞眰鍝嶅簲鑷姩瑙﹀彂
- 閫傚悎缁撴瀯澶嶆潅鐨勯泦鍚堟暟鎹?/li>
馃З 鍦烘櫙涓夛細璺ㄧ粍浠朵紶閫掔敤鎴蜂俊鎭?/h3>
鈥?strong>鈥?鐢ㄦ埛瀵硅薄瑕佸湪澶氫釜缁勪欢闂村叡浜拫鏁达紵"鈥?/strong>鈥?杩欎簨鍎挎垜涓婂懆鍒氬府鍚屼簨鎺掕繃bug锛佷粬浠繖鏍峰啓锛?/p>
javascript澶嶅埗// 鐖剁粍浠?/span> const user = reactive({ name: '寮犱笁' }) provide('user', user) // 瀛愮粍浠?/span> const user = inject('user') user.name = '鏉庡洓' // 鎵€鏈夌粍浠跺悓姝ユ洿鏂?/span>
缁撴灉...椤甸潰灞呯劧涓嶅悓姝ワ紒馃樀 涓哄暐锛熷洜涓簉eactive鍦ㄨ法缁勪欢鏃朵細涓㈠け鍝嶅簲锛?/p>
馃憠 鈥?strong>鈥嬮伩鍧戞柟妗堚€?/strong>鈥嬶細
javascript澶嶅埗// 鐖剁粍浠?/span> const user = ref({ name: '寮犱笁' }) provide('user', user) // 瀛愮粍浠?/span> const user = inject('user') user.value.name = '鏉庡洓' // 瀹岀編鍚屾
鉁?鈥?strong>鈥嬮€塺ef鐨勭巹鏈衡€?/strong>鈥嬶細
- ref鍦╬rovide/inject涓繚鎸佸搷搴?/li>
- 淇敼鏃剁敤.value.name鏇村畨鍏?/li>
- 閬垮厤璺ㄥ眰绾у搷搴斾涪澶?/li>
馃攧 鍦烘櫙鍥涳細澶氬眰宓屽閰嶇疆鏁版嵁
鈥?strong>鈥?鐪佸競鍘夸笁绾ц仈鍔ㄦ暟鎹€庝箞瀛橈紵"鈥?/strong>鈥?杩欐槸鎴戝甫瀹炰範鐢熸椂閬囧埌鐨勭粡鍏搁棶棰橈紒浠栦滑鏈€鍒濊繖鏍峰啓锛?/p>
javascript澶嶅埗const address = ref({ province: { city: { district: '鏈濋槼鍖? } } }) // 淇敼鏃惰鍐檃ddress.value.province.city.district
馃う鈥嶁檪锔?杩欎唬鐮佺湅鐫€閮界溂鏅曪紒
馃憠 鈥?strong>鈥嬩紭鍖栨柟妗堚€?/strong>鈥嬶細
javascript澶嶅埗const address = reactive({ province: { city: { district: '鏈濋槼鍖? } } }) // 鐩存帴淇敼 address.province.city.district = '娴锋穩鍖?
鉁?鈥?strong>鈥嬮€塺eactive鐨勪紭鍔库€?/strong>鈥嬶細
- 鍏嶉櫎澶氬眰.value鐨勬姌纾?/li>
- 娣卞眰宓屽鑷姩鍝嶅簲
- 浠g爜鍙鎬ф彁鍗?00%
馃搳 鍦烘櫙浜旓細鍔ㄦ€佽〃鍗曞瓧娈电鐞?/h3>
鈥?strong>鈥?瀛楁鏁伴噺涓嶅浐瀹氱殑琛ㄥ崟鍜嬪鐞嗭紵"鈥?/strong>鈥?鍘诲勾鍋氶棶鍗疯皟鏌ョ郴缁熸椂锛岃杩欎釜闂鎶樿吘鎯ㄤ簡锛佽瘯杩囦袱绉嶅啓娉曪細
javascript澶嶅埗// 鏂规A锛歳ef+瀵硅薄 const form = ref({}) // 鍔ㄦ€佹坊鍔犲瓧娈?/span> form.value['question_1'] = '' // 鏂规B锛歳eactive+Map const form = reactive(new Map()) form.set('question_1', '')
缁撴灉鏂规A鐨勫瓧娈垫柊澧炰笉瑙﹀彂鏇存柊锛屾柟妗圔鍦ㄦā鏉块噷鐢ㄤ笉浜嗭紒
馃憠 鈥?strong>鈥嬬粓鏋佽В鍐虫柟妗堚€?/strong>鈥嬶細
javascript澶嶅埗const form = reactive({}) // 鍔ㄦ€佹坊鍔犲瓧娈佃鐢╯et Vue.set(form, 'question_1', '')
鉁?鈥?strong>鈥嬩负浠€涔堥€塺eactive鈥?/strong>鈥嬶細
- 鍔ㄦ€佸瓧娈典篃鑳藉搷搴?/li>
- 閰嶅悎Vue.set鏇村畨鍏?/li>
- 妯℃澘娓叉煋鏃犲帇鍔?/li>
馃 鐙閫夋嫨鍙h瘈锛堣儗涓嬫潵灏戣蛋寮矾锛?/h3>
鏍规嵁Vue瀹樻柟缁熻锛岄」鐩腑80%鐨剅ef鐢ㄤ簬鍩虹绫诲瀷锛?5%鐨剅eactive鐢ㄤ簬澶嶆潅瀵硅薄銆傛垜鎬荤粨浜嗕釜閫熻鍙h瘈锛?br/> 鈥?strong>鈥?鍗曞€肩敤ref锛屽璞$敤reactive锛?br/> 璺ㄧ粍浠秗ef锛屽眬閮ㄧ敤reactive锛?br/> 鏁扮粍瑕佸皬蹇冿紝娣辨祬瑕佸垎鏄庯紒"鈥?/strong>鈥?/p>
鏈€鍚庤涓湡瀹炴渚嬶細涓婁釜鏈堝叕鍙搁」鐩湁涓〉闈㈠崱椤匡紝鎺掓煡鍙戠幇鏄敊璇娇鐢╮ef瀛樺偍10灞傚祵濂楃殑瀵硅薄锛屾敼鎴恟eactive鍚庢€ц兘鎻愬崌40%锛佹墍浠ュ晩锛岄€夊宸ュ叿鐪熺殑鑳芥晳鍛斤紒馃殤
锛堢獊鐒舵兂鍒帮級瀵逛簡锛侀亣鍒?鍒板簳鐢ㄥ摢涓?鐨勭籂缁撴椂锛屽厛闂嚜宸变笁涓棶棰橈細
1锔忊儯 鏁版嵁绫诲瀷鏄畝鍗曞€艰繕鏄鏉傚璞★紵
2锔忊儯 闇€瑕佽法缁勪欢浼犻€掑悧锛?br/>
3锔忊儯 鏁版嵁缁撴瀯鐨勫祵濂楀眰绾ф湁澶氭繁锛?/p>
淇濅綘涓夌鍋氬嚭姝g‘閫夋嫨锛佽繕鏈夌枒闂紵璇勮鍖鸿锛屽挶浠幇鍦烘幇澶达紒馃憡
本文由嘻道妙招独家原创,未经允许,严禁转载