当前位置: 首页 > Web前端 > vue.js

vue3的烂Api——Reactivity

时间:2023-03-31 15:53:35 vue.js

鐪嬪埌鏍囬锛屾槸涓嶆槸寰堟儕璁讹紵涔熻浣犱細瑙夊緱Reactivity鍦ㄨ璁′笂鏈夌己闄凤紵鍏跺疄閰掗鐨勬湰鎰忎笉鏄枬閰掞紒Reactivity鍙互璇存槸vue3涓渶澶嶆潅鐨勯儴鍒嗭紝褰撶劧涔熸槸鏈€寮哄ぇ鐨勪竴鐐广€傚惉璧锋潵鍍忎竴鍧楃‖楠ㄥご銆傝繖璁╂垜鎯宠捣浜嗐€婁袱鍓戙€嬩腑鏉庝簯榫欓潰瀵瑰皬鏃ユ湰鐨勬寫琛呰鐨勮瘽锛氭潵鐨勬槸闃庣帇锛屾垜涔熶笉寰椾笉鎶婁粬鐨勮儭瀛愭姳涓嬫潵銆傛墍浠ヤ粖澶╂垜浠篃鎺ュ彈浜哛eactivity鐨勮儭椤汇€傚湪vue3涓紝瀹冩毚闇蹭簡鎵€鏈夋暟鎹搷搴旂殑API锛岃繖鍦╲ue2涓槸娌℃湁鍋氬埌鐨勶紝閭d箞vue2鏄€庝箞鍋氬埌鐨勫憿锛熷畠灏嗘暟鎹厤缃垚鏁版嵁锛屾暟鎹腑鐨勬暟鎹細鑷姩鍙樻垚鍝嶅簲寮忔暟鎹€傛垜浠妸杩欎釜杩囩▼绉颁负娉ㄥ叆锛屽畠浼氳娉ㄥ叆鍒扮粍浠跺疄渚嬩腑锛屽涓嬶細{//data涓殑鏁版嵁閮芥槸鍝嶅簲寮忕殑锛屽畠浼氳娉ㄥ叆鍒扮粍浠跺疄渚嬩腑data(){return{name:"Forensic",idol:"Jobs",publicNumber:"Front-endHunter"}}}浣嗘槸鍦╲ue3涓紝瀹冧笉鍐嶆槸鏁版嵁锛岃€屾槸setup鍑芥暟锛屾垜浠О涔嬩负compositionApi锛屽鏋滄垜浠兂鍦╯etup鍑芥暟涓娇鐢ㄥ搷搴斿紡鏁版嵁锛屾垜浠笉鍙伩鍏嶅湴闇€瑕佹毚闇插搷搴斿紡Api浠ヤ緵鎴戜滑浣跨敤銆傛帴涓嬫潵鎴戜滑鐪嬬湅vue3鎻愪緵浜嗗摢浜沝ataResponsive鐩稿叧鐨勫姛鑳姐€傪煃嘒etResponsiveData鍙互鑾峰彇鍝嶅簲鏁版嵁鐨刟pi锛歳eactiveapi浼氫紶鍏ヤ竴涓璞★紝鐒跺悗杩斿洖涓€涓璞′唬鐞唒roxy锛屽彲浠ユ繁搴︿唬鐞嗗璞$殑鎵€鏈夋垚鍛橈紝涔熷氨鏄鍙互宓屽鍦ㄩ噷闈bject瀵硅薄涔熸槸涓€涓弽搴斿紡鏁版嵁绀轰緥馃尠锛歩mport{reactive}from'vue'conststate=reactive({name:"Forensic",age:18})window.state=state;鏁堟灉灞曠ず锛氱幇鍦ㄨ繖涓璞″彉鎴愪簡鍝嶅簲寮忕殑锛屽綋瀵硅薄琚搷浣滄椂锛孷ue鍙互鏀跺埌閫氱煡銆俽eadonlyAPI闇€瑕佷紶鍏ヤ竴涓璞℃垨鑰呬竴涓唬鐞嗭紝瀹冧篃浼氳繑鍥炰竴涓璞′唬鐞嗭紝鍙兘璇诲彇浠g悊瀵硅薄銆傛垚鍛橈紝浣嗕笉鑳戒慨鏀癸紝鍗冲彧鑳借幏鍙栵紝涓嶈兘璁剧疆锛屼篃鍙互娣卞害浠g悊瀵硅薄涓殑鎵€鏈夋垚鍛樸€備妇涓牀瀛愷煂帮細import{reactive,readonly}from'vue'constimState=readonly({name:"Forensic",age:18})window.imState=imState;鏁堟灉灞曠ず锛氱湅鍒版病鏈夛紝鎶ラ敊锛屾彁绀鸿瑕佷慨鏀圭殑鐩爣鏄彧璇荤殑銆傚鏋滀慨鏀瑰け璐ワ紝鎹readonly鍙互浼犻€掍竴涓璞℃垨鑰呬竴涓唬鐞嗐€傝鎴戜滑鐪嬬湅浼犻€掍唬鐞嗘椂浼氬彂鐢熶粈涔堛€俰mport{reactive,readonly}from'vue'conststate=reactive({name:"ForensicMedicine",age:18})constimState=readonly(state);//浼犻€掍竴涓猘gent鍒皐indow.imState=imState;鏁堟灉灞曠ず锛氶€氳繃浠g悊鏃讹紝涓嶅厑璁歌繘琛岃祴鍊兼搷浣滐紝鍙嶆鍙閫氳繃readonly锛屽氨鍙兘璇诲彇锛屼笉鑳借祴鍊笺€備笉杩囨垜浠彲浠ヤ慨鏀箁eadonly涔嬪墠鐨勫€硷紝鐒跺悗璁╁畠鍋氫唬鐞嗐€傪煋㈡敞鎰忥細reactive鍜宺eadonly锛岃繖涓や釜api鏄唬鐞嗗璞★紝涓嶈兘浠g悊鏅€氬€硷紝浼氭姤閿欍€備妇涓牀瀛愷煂帮細import{reactive,readonly}from'vue'conststate=reactive("forensic")鏁堟灉灞曠ず锛?[image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/54cc2bca665c491cb14ede3e3c3919e1~tplv-k3u1fbpfcp-watermark.image)鎶ヤ簡涓€涓獁arning锛屽師濮嬪€兼槸invalidProxy锛屾墍浠ュ鏋滈渶瑕佷唬鐞嗘櫘閫氬€兼€庝箞鍔烇紵鐒跺悗浣犻渶瑕佷娇鐢╜ref`api銆備换浣曟暟鎹兘鍙互鍦╮efref涓紶閫掞紝鏁版嵁鏈€缁堜細琚斁鍏ヤ竴涓璞′腑鐨剉alue涓紝姣斿this{value:...}锛屽value鐨勮闂槸鍝嶅簲寮忕殑锛屽鏋滆祴缁檝alue鐨勫€兼槸瀵硅薄锛屼細閫氳繃reactive鍑芥暟浠g悊涓句釜鏍楀瓙馃尠锛歩mport{reactive,readonly,ref}from'vue'conststate=ref({name:"Forensic",age:18})window.state=鐘舵€?鏁堟灉灞曠ず锛?[image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/41013bd555294aa3b53adc1c6602998e~tplv-k3u1fbpfcp-watermark.image)杩樻湁涓€绉嶇浜岀鎯呭喌鏄細濡傛灉浼犲叆鐨勫€煎凡缁忔槸浠g悊锛岄偅涔堢洿鎺ヤ娇鐢ㄤ唬鐞?*涓句釜鏍楀瓙馃尠锛?*```jsimport{reactive,readonly,ref}from'vue'conststate=reactive({name:"ForensicMedicine",age:18});constimState=ref(state)window.imState=imState;```**鏁堟灉灞曠ず锛?*![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9becafd7f0ab41c7b5d4f69c63a26d94~tplv-k3u1fbpfcp-watermark.image)computedcomputed闇€瑕佷紶鍏ヤ竴涓猣unction鍑芥暟锛屽畠杩斿洖鐨勫€煎拰ref涓€鏍凤紝涔熸槸{value:...}锛屽湪璇诲彇value鍊肩殑鏃跺€欙紝浼氭牴鎹儏鍐碉紝鍦ㄨ繖绉嶆儏鍐典笅灏辨槸鏄惁浣跨敤浜嗚繖涓嚱鏁帮紝缂撳瓨璧锋潵浜嗐€傚綋渚濊禆鐨勫搷搴旀暟鎹病鏈夊彉鍖栨椂锛岃幏鍙栫紦瀛樹腑鐨勫€笺€傚彧鏈夊綋state.name鎴杝tate.age鏀瑰彉鏃讹紝瀹冩墠浼氬啀娆℃洿鏂般€傝窇涓牀瀛愷煂帮細import{reactive,readonly,ref,computed}from'vue'conststate=reactive({name:"Forensic",age:18})constresult=computed(()=>{console.log("computed");returnstate.name+state.age})console.log(result.value);鏁堟灉灞曠ず锛?[](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d0f14b8654a94861a9100de3088923b6~tplv-k3u1fbpfcp-watermark.image)鍙嶆涓婇潰鍥涗釜API鏃犺鎬庝箞澶勭悊锛岄兘鏄湁涓€涓洰鐨勶紝灏辨槸鎶婃暟鎹彉鎴愬搷搴斿紡鏁版嵁銆傞偅涔堝湪寮€鍙戜腑浣跨敤鍝竴涓紵1.濡傛灉浣犳兂璁╀竴涓璞″彉鎴愬搷搴斿紡鏁版嵁锛屼綘鍙互浣跨敤`reactive`鎴栬€卄ref`2銆傚鏋滆浣垮璞$殑鎵€鏈夊睘鎬у彧鑳借鍙栵紝璇蜂娇鐢╮eadonly3銆傚鏋滀綘鎯宠涓€涓潪瀵硅薄鏁版嵁鎴愪负鍝嶅簲寮忔暟鎹紝浣跨敤`ref`4銆傚鏋滀綘鎯虫牴鎹凡鐭ョ殑鍝嶅簲鏁版嵁鑾峰彇涓€涓柊鐨勫搷搴旀暟鎹紝浣跨敤`computed`馃摙娉ㄦ剰锛氫娇鐢╜ref`鏃讹紝浣犺鑾峰彇鐨勬暟鎹繀椤绘槸`ref.value`ha锛屽惁鍒欒幏鍙栦笉鍒帮紝璁颁綇锛侌煒侌煃夌洃鍚暟鎹彉鍖杦atchEffectconststop=watchEffect(()=>{//watchEffect鍑芥暟浼氱珛鍗虫墽琛岋紝鐒跺悗鐩戝惉鍑芥暟涓娇鐢ㄧ殑鍝嶅簲寮忔暟鎹紝鍝嶅簲寮忔暟鎹彉鍖栧悗鍐嶆鎵ц})//閫氳繃璋冪敤stop鐨刦unctionwillstoplisteningstop();//鍋滄鐩戝惉涓句釜鏍楀瓙馃尠:import{reactive,ref,watchEffect}from"vue";conststate=reactive({a:1,b:2,});甯告暟璁℃暟=鍙傝€冿紙0锛夛紱watchEffect(()=>{console.log(state.a,count.value);//椹笂鎵ц涓€娆)state.a++;//杩欎釜瑕佺湅鏁版嵁鍙樺寲锛屽啀鎵ц涓€娆℃晥鏋滃睍绀猴細watchEffect鍑芥暟涔嬫墍浠ョ煡閬撲緷璧栧彂鐢熶簡鍙樺寲锛屾槸鍥犱负閲岄潰鐨勬暟鎹槸鍝嶅簲寮忕殑銆傝鍙栨暟鎹椂浣跨敤get鏂规硶锛実et浼氭敹闆嗕緷璧栥€傝繕闇€瑕佹敞鎰忕殑鏄紝濡傛灉渚濊禆鐨勬暟鎹悓鏃跺彉鍖栦簡寰堝娆★紝鏈€鍚庣殑缁撴灉浼氭樉绀轰竴娆★紝鍥犱负杩愯杩囩▼鏄紓姝ョ殑锛屼細鍦ㄥ井闃熷垪涓墽琛岋紝鐩村埌鏁版嵁鍙戠敓鍙樺寲鎵嶄細杩愯鏀瑰彉浜嗭紝濡備笅渚嬫墍绀猴細涓句釜鏍楀瓙馃尠锛歩mport{reactive,ref,watchEffect}from"vue";conststate=reactive({a:1,b:2,});甯告暟璁℃暟=鍙傝€冿紙0锛夛紱watchEffect(()=>{console.log(state.a,count.value);})//杩愯澶氭state.a++;鐘舵€?a++;鐘舵€?a++;鐘舵€?a++;鐘舵€?a++;鐘舵€?a++;鐘舵€?a++;鐘舵€併€俛++;鏁堟灉灞曠ず锛氫粠鏈€缁堢粨鏋滃彲浠ョ湅鍑猴紝鏈€缁堝彧杩愯浜嗕袱娆★紝涓€娆℃槸绔嬪嵆鎵ц锛岀浜屾鏄湪鏁版嵁鏀瑰彉涔嬪悗銆倃atch鐩稿綋浜巚ue2鐨?watch銆傝繖涓獁atch鏈夌偣楹荤儲锛屽洜涓洪渶瑕佹墜鍔ㄦ寚瀹氥€傜洃鍚摢浜涘€煎彂鐢熶簡鍙樺寲锛屽綋鍙戠敓鍙樺寲鏃讹紝浼氱粰浣犱竴涓悓鏃舵湁鏂板€煎拰鏃у€肩殑鏍楀瓙锛歩mport{reactive,ref,watch}from"vue";conststate=reactive({a:1,b:2,});甯告暟璁℃暟=鍙傝€冿紙0锛夛紱watch(()=>state.a,(newValue,oldValue)=>{console.log("newvalue",newValue,"oldvalue",oldValue);})state.a++;//淇敼渚濊禆鏁堟灉灞曠ず锛氿煋㈡敞鎰忥細杩欓噷闇€瑕佹敞鎰忕殑鏄紝watch鍜寃atchEffect鐨勫尯鍒槸watch涓嶄細绔嬪嵆杩愯鍑芥暟锛屽畠鍙細鍦ㄤ緷璧栫殑鍊煎彂鐢熷彉鍖栨椂鎵嶆墽琛岋紝watch涓細浼犻€掍袱涓弬鏁般€備笂闈㈢殑渚嬪瓙涓紝浼犻€掔殑鏄?)=>state.a锛屼负浠€涔堜笉鐩存帴浼犻€抯tate.a鍛紵濡傛灉鐩存帴浼爏tate.a锛岀浉褰撲簬浼犲叆浜嗕竴涓?锛屾墍浠ユ暟鎹槸娌℃湁鍝嶅簲寮忕殑锛屽涓嬩妇涓牀瀛愷煂帮細鐩存帴浼爏tate.aimport{reactive,ref,watch}from"vue"锛沜onst鐘舵€?鍙嶅簲鎴?{a:1,b:2,});甯告暟璁℃暟=鍙傝€冿紙0锛夛紱watch(state.a,(newValue,oldValue)=>{console.log("newvalue",newValue,"oldvalue",oldValue);})state.a++;//淇敼渚濊禆鏁堟灉灞曠ず锛氬鏋渟tate.a鐩存帴浼犺繃鍘伙紝杩欓噷浼氭姤璀﹀憡锛岀炕璇戣繃鏉ュ氨鏄細invalidmonitoringsource:1monitoringsourcecanonlybeagetter/effectfunction,ref,passiveobjects,orarraysofthesetypes锛屼篃灏辨槸璇磋繖閲岀殑鍙傛暟鍙兘鍝嶅簲鏁版嵁銆傚綋灏?)=>state.a鍑芥暟浼犻€掔粰瀹冩椂锛屽畠浼氬湪鎵嬭〃涓繍琛岋紝浠ヤ究鏀堕泦渚濊禆椤广€傚湪浣跨敤reactiveapi鐨勬椂鍊欙紝闇€瑕佷紶鍏ヨ繖鏍蜂竴涓嚱鏁般€備娇鐢╮efapi鏃讹紝watch涓殑绗竴涓弬鏁板彲浠ュ啓鎴恈ount锛屽洜涓篶ount鏄竴涓璞★紝濡備笅锛氫妇涓牀瀛愷煂帮細鐩存帴浼燾ountimport{reactive,ref,watch}from"vue";conststate=reactive({a:1,b:2,});甯告暟璁℃暟=鍙傝€冿紙0锛夛紱watch(count,(newValue,oldValue)=>{console.log("Newvalue",newValue,"oldvalue",oldValue);})count.value++;//淇敼渚濊禆鏁堟灉灞曠ず锛氬鏋滀竴涓猚ount.value鏄紶鍏ワ紝涔熶細鎶ラ敊锛屽洜涓轰篃鑾峰彇浜哻ount.value灞炴€у€煎涓嬶細涓句釜鏍楀瓙馃尠锛氱洿鎺ヤ紶countimport{reactive,ref,watch}from"vue";conststate=reactive({a:1,b:2,});甯搁噺璁℃暟=ref(0);watch(count.value,(newValue,oldValue)=>{console.log("NewValue",newValue,"OldValue",oldValue);})count.value++;//淇敼渚濊禆鏁堟灉灞曠ず锛氫粠杩愯缁撴灉锛岃繕鎶ヤ簡涓€涓獁arning锛屾墍浠ヨ繖鍧椾綘瑕佹敞鎰忎竴涓嬸煒氬浜嗭紝鎴戝樊鐐瑰繕浜唚atch鍙互鐩戞帶澶氫釜鏁版嵁锛屽涓嬶細涓句釜鏍楀瓙馃尠锛歱asscountand()=>state.aimport{reactive,ref,watch}鏉ヨ嚜鈥渧ue鈥濓紱conststate=reactive({a:1,b:2,});甯告暟璁℃暟=鍙傝€冿紙0锛夛紱watch([()=>state.a,count],([newValue1,newValue2],[oldValue1,oldValue2])=>{console.log("鏂板€?,newValue1,newValue2,"鏃у€?,oldValue1,鏃у€?);})璁℃暟鍊?+;鐘舵€?a++;鏁堟灉灞曠ず锛氿煋㈡敞鎰忥細涓嶇鏄痺atch杩樻槸watchEffect锛屽綋渚濊禆鍙戠敓鍙樺寲鏃讹紝鍥炶皟鍑芥暟鏄紓姝ユ墽琛岀殑锛屽綋鐒朵細鍘诲井闃熷垪绛夊緟鎵ц涓€鑸潵璇达紝watchEffect鏄渶鏂逛究鐨勶紝鍥犱负瀹冧細鑷姩璺熻釜渚濊禆鐨勫彉鍖栵紝涓嶉渶瑕佹墜鍔ㄦ寚瀹氾紝浣嗘槸鏈夋椂鍊欐垜浠笉寰椾笉浣跨敤watch锛屾瘮濡傦細鎴戜滑涓嶆兂涓€寮€濮嬪氨鎵ц鍥炶皟鍑芥暟锛屽彧鎯宠瀹僼o鍙湁鍦ㄦ暟鎹彂鐢熷彉鍖栨椂鎵嶄細鎵ц銆傝繖涓椂鍊欐垜浠氨鍙兘鐢╳atch浜嗐€傚彟涓€绉嶆柟寮忔槸褰撴暟鎹彂鐢熷彉鍖栨椂锛屾垜浠渶瑕佺煡閬撴棫鍊兼槸澶氬皯锛熻繖涓椂鍊欐垜浠繕闇€瑕佺敤鍒皐atch銆傛渶鍚庝竴涓槸鎴戜滑闇€瑕佺洃鍚竴浜涘湪鍥炶皟鍑芥暟涓病鏈夌敤鍒扮殑鏁版嵁锛屾瘮濡傝緭鍑篶onsole.log("鎴戣鏀?)锛寃atchEffect涓槸鍋氫笉鍒扮殑馃崑鍒ゆ柇鏈夊洓绉嶈幏鍙栧搷搴斿紡鏁版嵁鏃剁殑API绫诲瀷锛屽嵆reactive銆乺eadonly銆乺ef鍜宑omputed銆傝繑鍥炴湁涓ょ褰㈠紡锛屼竴绉嶆槸瀵硅薄浠g悊锛屼竴绉嶆槸{value:...}銆傛湁鏃跺€欐垜浠彲鑳介啋涓嶈繃鏉ワ紝鑴戝瓙涓€鐗囨贩涔憋紝鎵€浠ue3鎻愪緵浜?涓狝PI鏉ュ尯鍒嗛€氳繃鍝鏂瑰紡鑾峰彇鍝嶅簲寮忔暟鎹細涓€鏉℃暟鎹槸閫氳繃reative鍒涘缓鐨勶紝鍏蜂綋鍙互鍙傝€冭繖涓摼鎺ワ細https://v3.vuejs.org/api/basi...isReadonly锛氬垽鏂竴鏉℃暟鎹槸鍚︽槸閫氳繃readonly鍒涘缓鐨刬sRef:to鍒ゆ柇涓€鏉℃暟鎹槸鍚︽槸ref瀵硅薄##馃崋杞崲鏈夋椂鍊欐垜浠嬁鍒颁竴鏉℃暟鎹紝鎴戜滑骞朵笉鐭ラ亾瀹冩槸浠€涔堬紝鏈夋椂鍊欐垜浠篃涓嶅叧蹇冨畠銆備笉绠℃槸ref杩樻槸proxy锛岄閮戒笉鐭ラ亾鏄粈涔堬紒杩欐椂鍊欐垜浠彲浠ヤ娇鐢╱nrefunrefunref绛変环浜庯細isRef(val)锛焮todos=unref(todos);//...鍏朵粬浠g爜}toReftoRef浼氬皢鍝嶅簲寮忓璞′腑鐨勪竴涓睘鎬ц浆鎹㈡垚ref鏍煎紡鐨勬暟鎹妇涓牀瀛愷煂帮細import{reactive,toRef}from"vue";conststate=reactive({name:"Forensic",age:18});constnameRef=toRef(state,"name");console.log(nameRef);//鏈€鍚巤value:...}ThisformnameRef.value="FrontHunter";//淇敼杩欎釜鍊兼椂锛宻tate涓殑鏁版嵁涔熶細鍙楀埌褰卞搷console.log(state.name);鏁堟灉灞曠ず锛歵oRefs鎶婁竴涓猺eactive瀵硅薄鐨勬墍鏈夊睘鎬ч兘杞负ref鏍煎紡锛岀劧鍚庢墦鍖呮垚涓€涓猵lain-object鏅€氬璞¤繑鍥炰竴涓牀瀛愷煂帮細import{reactive,toRefs}from"vue";conststate=reactive({name:"forensic",age:18});conststateAsRefs=toRefs(state);console.log(stateAsRefs);/*stateAsRefs涓嶆槸浠g悊瀵硅薄锛岃€屾槸鏅€氬璞★紝鏍煎紡濡備笅:{name:{value:ObjectRefImpl},age:{value:ObjectRefImpl}}*/鏁堟灉灞曠ず锛氫负浠€涔堣杩欐牱鍋氾紵涓句釜鏍楀瓙馃尠锛氭垜浠渶瑕佸皢涓や釜鍙嶅簲寮忔暟鎹贩鍚堝湪涓€璧枫€傚鏋滄垜浠洿鎺ヤ娇鐢ㄥ睍寮€杩愮畻绗﹀氨瀹屼簡锛屾暟鎹細澶卞幓reactivesetup(){conststate1=reactive({a:1,b:2});conststate2=reactive({c:3,d:4});return{...state1,//澶卞幓鍝嶅簲鎬э紝鐩稿綋浜庡湪杩欓噷鍐檃:1,b:2...state2,//澶卞幓鍝嶅簲鎬э紝鐩稿綋浜庡湪杩欓噷鍐欎竴涓猚:3,d:4};}锛岄偅涔堟€庝箞瑙e喅鍛紵鍙渶鍦╯etup()涔嬪鏀剧疆涓€涓猼oRefs{conststate1=reactive({a:1,b:2});conststate2=reactive({c:3,d:4});return{...toRefs(state1),//responsive...toRefs(state2),//responsive};},馃槉濂戒簡锛屼互涓婂氨鏄垜鐨勫垎浜紝甯屾湜瀵瑰ぇ瀹舵湁鎵€甯姪锛屾杩庤璁鸿瘎璁哄尯~甯屾湜澶у鍠滄馃憤鏀寔~馃槝锛屾垜浼氭洿鏈夊姩鍔涚殑馃锛屾櫄瀹夛紒