1.初識setUp的使用

  1. 簡單介紹下面的程式碼功能:
  2. 使用ref函式,去使用監聽某一個變數的變化,並且把它渲染到檢視上。
  3. setUp函式是組合API的入口函式。這個是非常重要的。
  4. setUp可以去監聽變數的變化哈!我們將會利用它
  5. ref vue中內建,需要匯入。

  1. <template>
  2. <div>{{ countNum}}</div>
  3. <button @click="handerFunc">按鈕</button>
  4. </template>
  5. <script>
  6. import {ref} from 'vue'
  7. export default {
  8. name: 'App',
  9. setup() {
  10. // 這一句表示的是定義了一個變數count。這個變數的初始值是100
  11. let countNum=ref(100);
  12. // 在組合API中,如果想定義一個方法,不用定義到methods中去。直接定義就可以了
  13. function handerFunc(){
  14. // console.log(countNum);//countNum是一個物件
  15. countNum.value += 10;
  16. }
  17. //在組合api中定義的方法,或者變數。如果外界需要使用,那麼必須通過 return {aaa,func} 的方式暴露出去
  18. return { countNum ,handerFunc}
  19. }
  20. }
  21. </script>

2認識reactive的使用

  1. ref函式只能夠去監聽簡單型別的資料變化。
  2. 不能夠去監聽,複雜型別的變化(陣列、物件)。
  3. 所以我們的主角reactive就出現了。
  4. setup 中的函式會自動執行一次。

  1. <template>
  2. <div>
  3. <ul>
  4. <li v-for="item in satte.arr" :key="item.id">
  5. {{item.name }}
  6. </li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script>
  11. import {reactive} from 'vue'
  12. export default {
  13. name: 'App',
  14. setup(){
  15. console.log("setUp會自動執行的")
  16. // ref函式的注意點:
  17. // ref函式只能夠去監聽簡單型別的資料變化,不能夠去監聽,複雜型別的變化(陣列、物件)
  18. // reactive 方法裡面是一個物件
  19. let satte=reactive({
  20. arr:[
  21. {name:"司藤",id:'0011'},
  22. {name:"皮囊之下",id:'0011'},
  23. {name:"百歲之約",id:'0012'},
  24. {name:"三生三世",id:'0013'},
  25. ]
  26. })
  27. return { satte }
  28. },
  29. }
  30. </script>

3使用reactive 實現檢視的刪除

  1. <template>
  2. <div>
  3. <ul>
  4. <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
  5. {{item.name }}
  6. </li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script>
  11. import {reactive} from 'vue'
  12. export default {
  13. name: 'App',
  14. setup(){
  15. let satte=reactive({
  16. arr:[
  17. {name:"司藤",id:'0011'},
  18. {name:"皮囊之下",id:'0011'},
  19. {name:"百歲之約",id:'0012'},
  20. {name:"三生三世",id:'0013'},
  21. ]
  22. })
  23. // 刪除被點選的元素
  24. function del(index){
  25. for(let i=0;i<satte.arr.length;i++){
  26. if(index==i){
  27. satte.arr.splice(i,1)
  28. }
  29. }
  30. }
  31. return { satte, del}
  32. },
  33. }
  34. </script>

4將刪除的邏輯分離出去,形成一個單獨的模組

  1. <template>
  2. <div>
  3. <ul>
  4. <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
  5. {{item.name }}
  6. </li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script>
  11. import {reactive} from 'vue'
  12. export default {
  13. name: 'App',
  14. setup(){
  15. // onlyDelLuoJi() 方法中含有一個數組 和一個方法;類似於解構
  16. let {satte,del }=onlyDelLuoJi();
  17. // 暴露給外界使用
  18. return { satte,del}
  19. },
  20. }
  21. function onlyDelLuoJi(){
  22. let satte=reactive({
  23. arr:[
  24. {name:"司藤",id:'0011'},
  25. {name:"皮囊之下",id:'0011'},
  26. {name:"百歲之約",id:'0012'},
  27. {name:"三生三世",id:'0013'},
  28. ]
  29. })
  30. // 刪除被點選的元素
  31. function del(index){
  32. for(let i=0;i<satte.arr.length;i++){
  33. if(index==i){
  34. satte.arr.splice(i,1)
  35. }
  36. }
  37. }
  38. // 將資料satte 和方法 del 暴露出去
  39. return { satte,del }
  40. }
  41. </script>

5. 實現新增功能,事件之間傳遞引數

  1. <template>
  2. <div>
  3. <div>
  4. <input type="text" v-model="addobj.watchTv.name">
  5. <button @click="addHander">新增</button>
  6. </div>
  7. <ul>
  8. <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
  9. {{item.name }}
  10. </li>
  11. </ul>
  12. </div>
  13. </template>
  14. <script>
  15. import {reactive} from 'vue'
  16. export default {
  17. name: 'App',
  18. setup(){
  19. // onlyDelLuoJi() 方法中含有一個數組 和一個方法;類似於解構
  20. let {satte,del }=onlyDelLuoJi();
  21. // 傳遞引數satte 是onlyDelLuoJi函式中提供的satte。進行傳遞
  22. let { addobj,addHander }=OnlyaddHander(satte);
  23. // 暴露給外界使用
  24. return { satte,del,addobj, addHander}
  25. },
  26. }
  27. //新增功能模組
  28. function OnlyaddHander(satte){
  29. console.log('初始化新增',satte)
  30. let addobj=reactive({
  31. watchTv:{
  32. name:"",
  33. id:""
  34. }
  35. });
  36. function addHander(){
  37. // 重置清空 錯吳做法
  38. // satte.arr.push(addobj.watchTv)
  39. // addobj.watchTv.name = "";
  40. // addobj.watchTv.id = "";
  41. // 正確做法
  42. let oldobj = Object.assign({}, addobj.watchTv)
  43. satte.arr.push(oldobj)
  44. }
  45. return { addobj,addHander }
  46. }
  47. //刪除功能模組
  48. function onlyDelLuoJi(){
  49. console.log('刪除初始化')
  50. let satte=reactive({
  51. arr:[
  52. {name:"司藤",id:'0011'},
  53. {name:"皮囊之下",id:'0011'},
  54. {name:"百歲之約",id:'0012'},
  55. {name:"三生三世",id:'0013'},
  56. ]
  57. })
  58. // 刪除被點選的元素
  59. function del(index){
  60. for(let i=0;i<satte.arr.length;i++){
  61. if(index==i){
  62. satte.arr.splice(i,1)
  63. }
  64. }
  65. }
  66. // 將資料satte 和方法 del 暴露出去
  67. return { satte,del }
  68. }
  69. </script>

6 將他們抽離成單獨的檔案

  1. 我們想在想將新增刪除相關的邏輯,單獨抽離成一個檔案。
  2. add.js 是新增相關的邏輯
  3. del.js 是刪除的相關邏輯
add.js

  1. import { reactive } from "vue"
  2. function OnlyaddHander(satte){
  3. console.log('初始化新增',satte)
  4. let addobj=reactive({
  5. watchTv:{
  6. name:"",
  7. id:""
  8. }
  9. });
  10. function addHander(e){
  11. // 重置清空 錯吳做法
  12. // satte.arr.push(addobj.watchTv)
  13. // addobj.watchTv.name = "";
  14. // addobj.watchTv.id = "";
  15. // 正確做法
  16. let oldobj = Object.assign({}, addobj.watchTv)
  17. satte.arr.push(oldobj)
  18. e.preventDefault();
  19. }
  20. return { addobj,addHander }
  21. }
  22. export default OnlyaddHander
adel.js

  1. import {reactive } from "vue"
  2. function onlyDelLuoJi() {
  3. console.log('刪除初始化')
  4. let satte=reactive({
  5. arr:[
  6. {name:"司藤",id:'0011'},
  7. {name:"皮囊之下",id:'0011'},
  8. {name:"百歲之約",id:'0012'},
  9. {name:"三生三世",id:'0013'},
  10. ]
  11. })
  12. // 刪除被點選的元素
  13. function del(index){
  14. for(let i=0;i<satte.arr.length;i++){
  15. if(index==i){
  16. satte.arr.splice(i,1)
  17. }
  18. }
  19. }
  20. // 將資料satte 和方法 del 暴露出去
  21. return { satte,del }
  22. }
  23. export default onlyDelLuoJi
主檔案
  1. <template>
  2. <div>
  3. <div>
  4. <input type="text" v-model="addobj.watchTv.name">
  5. <button @click="addHander">新增</button>
  6. </div>
  7. <ul>
  8. <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
  9. {{item.name }}
  10. </li>
  11. </ul>
  12. </div>
  13. </template>
  14. <script>
  15. import onlyDelLuoJi from "./components/del"
  16. import OnlyaddHander from "./components/add"
  17. export default {
  18. name: 'App',
  19. setup(){
  20. // onlyDelLuoJi() 方法中含有一個數組 和一個方法;類似於解構
  21. let {satte,del }=onlyDelLuoJi();
  22. // 傳遞引數
  23. let { addobj,addHander }=OnlyaddHander(satte);
  24. // 暴露給外界使用
  25. return { satte,del,addobj, addHander}
  26. },
  27. }
  28. </script>
  1. 如果你覺得不錯請點一個推薦。
  2. 你的推薦是我寫下去的動力。非常感謝!