<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
vue3 中新增了 setup,它的出現是為了解決元件內容龐大後,理解和維護元件變得困難的問題。即 vue 中 data、computed、methods、watch 等內容非常多以後,同一業務邏輯的 data 中的資料和 methods 中的方法在 vue 檔案中“相隔甚遠”,看程式碼時,經常需要根據 data 中的資料去搜尋找到對應的 methods 方法,上下跳躍檢視程式碼,非常不方便。而在 setup 中,則可以把 data 中的資料和 methods 方法寫在相臨的位置,方便檢視和維護。
先簡單寫一下看看效果
筆者這裡使用新建的 vue3 專案,直接在 App.vue 上進行修改
<template> <div>{{name}}</div> </template> <script> export default { setup() { return { name: "淚眼問花花不語,亂紅飛過鞦韆去" } } } </script>
原來寫在 data 中的 name,在 setup 中需要 return 返回
執行效果
先看下面程式碼,再說在 setup 中如何修改
<template> <div> {{name}} <button @click="change">修改</button> </div> </template> <script> export default { setup() { let name = "淚眼問花花不語,亂紅飛過鞦韆去" function change() { name = "人生自是有情痴,此恨不關風與月" } return { name, change } } } </script>
按照常規邏輯,修改 setup 中的 name,會自然地寫出上面的程式碼
但是這段程式碼是不能完成 name 值的修改的,看執行效果
為什麼 name 值沒有改變呢?因為上面程式碼中 name 是非響應式的
如果想要修改 name 值,就需要把它改成響應式的,程式碼如下
<template> <div> {{name}} <button @click="change">修改</button> </div> </template> <script> import { ref } from 'vue' export default { setup() { let name = ref("淚眼問花花不語,亂紅飛過鞦韆去") function change() { name.value = "人生自是有情痴,此恨不關風與月" } return { name, change } } } </script>
使用 ref 對 name 進行包裝
修改時使用 變數名.value 的語法
執行效果
除了使用 ref 外還可以使用 reactive ,二者都可以將原始資料型別轉換成一個帶有響應式特性的資料型別
ref 和 reactive 有什麼區別,ref 一般處理基本型別;reactive 處理複雜的資料型別
reactive 使用程式碼
<template> <div> {{nameObj.name}} <button @click="change">修改</button> </div> </template> <script> import {reactive} from 'vue' export default { setup() { let nameObj = reactive({name: '今年花勝去年紅。可惜明年花更好,知與誰同'}) function change() { nameObj.name = "離愁漸遠漸無窮,迢迢不斷如春水" } return { nameObj, change } } } </script>
執行效果
程式碼寫成 setup 形式,如何實現父子元件通訊,下面介紹
在 components 目錄下新建 Article.vue 作為子元件
Article.vue 內容
<template> <div> {{msg}} {{info}} </div> </template> <script> export default { props:['msg'], setup(props) { console.log(props.msg) return { info:props.msg } } } </script>
在 setup 方法內使用 props 來接收父元件傳過來的資料
App.vue 為父元件
在 App.vue 中引入 Article.vue
<template> <div> <Article :msg="name"></Article> </div> </template> <script> import Article from '@/components/Article.vue' export default { components: { Article }, setup() { return { name: '漸行漸遠漸無書,水闊魚沉何處問' } } } </script>
執行效果
Article.vue 內容
<template> <div> {{msg}} <button @click="sendToParent">子元件向父元件傳遞資料</button> </div> </template> <script> export default { props:['msg'], setup(props, content) { console.log(props.msg) function sendToParent() { content.emit('change') } return { sendToParent } } } </script>
使用 setup 方法中 content 引數中的 emit
App.vue 內容
<template> <div> <Article :msg="name" @change="changeName"></Article> </div> </template> <script> import Article from '@/components/Article.vue' export default { components: { Article }, setup() { function changeName() { alert('父元件事件被呼叫') } return { name: '漸行漸遠漸無書,水闊魚沉何處問', changeName } } } </script>
執行效果
子元件向父元件傳遞資料,父元件修改資料
Article.vue 內容
<template> <div> {{msg}} <button @click="sendToParent">子元件向父元件傳遞資料</button> </div> </template> <script> export default { props:['msg'], setup(props, content) { console.log(props.msg) let newName = '群芳過後西湖好,狼籍殘紅。飛絮濛濛。垂柳闌干盡日風' function sendToParent() { content.emit('change', newName) } return { sendToParent } } } </script>
App.vue 內容
<template> <div> <Article :msg="name" @change="changeName"></Article> </div> </template> <script> import Article from '@/components/Article.vue' import {ref} from 'vue' export default { components: { Article }, setup() { let name = ref('漸行漸遠漸無書,水闊魚沉何處問') function changeName(msg) { name.value = msg } return { name, changeName } } } </script>
App.vue 中的 name 要修改,所以使用 ref 包裝
執行效果
在 setup 裡,生命週期勾點前面加上 “on” 來存取元件的生命週期勾點
setup 是圍繞 beforeCreate
和 created
生命週期勾點執行的,所以不需要顯式地定義它們
setup 內部呼叫生命週期勾點
程式碼範例
<template> <div></div> </template> <script> import { onBeforeMount, onMounted } from "vue" export default { setup() { onBeforeMount(()=>{ console.log('onBeforeMount') }) onMounted(()=>{ console.log('mouted') }) return {} } } </script>
執行效果
以上就是前端vue3架構setup使用教學的詳細內容,更多關於vue3 setup教學的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45