Advertisement

277 Time to Practice Composition API Core Building Blocks - Solution

阅读量:

示例

App.vue

复制代码
 <template>

    
   <header>
    
     <h1>Expense Tracker</h1>
    
   </header>
    
   <section>
    
     <div>Available Funds: {{ availableFunds }}</div>
    
     <div>Total Expenses: {{ currentExpenses }}</div>
    
     <hr>
    
     <div>Funds left: {{ remainingFunds }}</div>
    
   </section>
    
   <section>
    
     <form @submit.prevent="addExpense">
    
       <div>
    
     <label for="amount">Amount</label>
    
     <input id="amount" type="number" v-model="enteredExpense">
    
       </div>
    
       <button>Add Expense</button>
    
     </form>
    
   </section>
    
 </template>
    
  
    
 <script>
    
 /*//Options API
    
 export default {
    
   data() {
    
     return {
    
       availableFunds: 100,
    
       currentExpenses: 0,
    
       enteredExpense: 0
    
     };
    
   },
    
   computed: {
    
     remainingFunds() {
    
       return this.availableFunds - this.currentExpenses;
    
     }
    
   },
    
   methods: {
    
     addExpense() {
    
       if (this.enteredExpense > 0) {
    
     this.currentExpenses += this.enteredExpense;
    
     this.enteredExpense = 0;
    
       }
    
     }
    
   },
    
   watch: {
    
     remainingFunds(val) {
    
       if (val < 0) {
    
     alert('You have no funds left!');
    
       }
    
     }
    
   }
    
 }; 
    
 */
    
 //Composition API
    
 import { ref, computed, watch } from 'vue';
    
 export default {
    
   setup() {
    
     const availableFunds = ref(100);
    
     const currentExpenses = ref(0);
    
     const enteredExpense = ref(0);
    
  
    
     const remainingFunds = computed(() => {
    
       return availableFunds.value - currentExpenses.value;
    
     });
    
     function addExpense() {
    
       if (enteredExpense.value > 0) {
    
     currentExpenses.value += enteredExpense.value;
    
     enteredExpense.value = 0;
    
       }
    
     };
    
     watch(remainingFunds, (newValue, oldValue) => {
    
       if (newValue < 0) {
    
     alert('You have no funds left!');
    
       }
    
     });
    
  
    
     return {
    
       availableFunds,
    
       currentExpenses,
    
       enteredExpense,
    
       remainingFunds,
    
       addExpense
    
     };
    
   }
    
 };
    
 </script>
    
  
    
 <style scoped>
    
 header {
    
   background-color: #007bff;
    
   /* 一种蓝色背景色 */
    
   color: white;
    
   /* 白色文字颜色,以在蓝色背景上清晰显示 */
    
   padding: 20px;
    
   /* 内边距,让内容与边缘有一定距离 */
    
   text-align: center;
    
   /* 文本居中显示 */
    
 }
    
  
    
 .logo {
    
   display: block;
    
   margin: 0 auto 2rem;
    
 }
    
  
    
 section {
    
   margin: 3rem auto;
    
   max-width: 30rem;
    
   border-radius: 12px;
    
   box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
    
   padding: 1rem;
    
 }
    
 </style>
    
 
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/5lmwjQ8nVAThbx4W0sG6aFd2EIzM.png)

全部评论 (0)

还没有任何评论哟~