Skip to content
⚠️ This article was written in 2021. Some content may be outdated.

Vue 3 script-setup Syntax Sugar

Vue 3 script-setup 语法糖 is becoming increasingly widespread in frontend development. This article dives into its core principles and best practices from real projects.

Basic Usage

Let's start with the basic implementation:

javascript
import { ref, computed, watch, onMounted } from 'vue'

export default {
  setup() {
    const count = ref(0)
    const doubled = computed(() => count.value * 2)

    watch(count, (newVal, oldVal) => {
      console.log(`count: ${oldVal} -> ${newVal}`)
    })

    onMounted(() => { console.log('组件已挂载') })

    return { count, doubled }
  }
}

This code demonstrates the basic usage. In real projects, you also need to consider error handling and edge cases.

Advanced Usage

Building on this foundation, we can further optimize:

javascript
import { reactive, toRefs, computed } from 'vue'

function useCounter(initial = 0) {
  const state = reactive({ count: initial, history: [initial] })
  const doubled = computed(() => state.count * 2)

  function increment() {
    state.count++
    state.history.push(state.count)
  }

  return { ...toRefs(state), doubled, increment }
}

This pattern is very practical in large projects and can significantly reduce maintenance costs.

Practical Cases

实际项目中的用法会更复杂一些:

javascript
import { ref, computed, watch, onMounted } from 'vue'

export default {
  setup() {
    const count = ref(0)
    const doubled = computed(() => count.value * 2)

    watch(count, (newVal, oldVal) => {
      console.log(`count: ${oldVal} -> ${newVal}`)
    })

    onMounted(() => { console.log('组件已挂载') })

    return { count, doubled }
  }
}

Through this approach, both the testability and scalability of the code are improved.

Performance Optimization

Here is a complete example:

javascript
import { reactive, toRefs, computed } from 'vue'

function useCounter(initial = 0) {
  const state = reactive({ count: initial, history: [initial] })
  const doubled = computed(() => state.count * 2)

  function increment() {
    state.count++
    state.history.push(state.count)
  }

  return { ...toRefs(state), doubled, increment }
}

Pay attention to boundary condition handling, which is critical in production.

Summary

  • Code examples are for reference only and need to be adjusted according to your business scenario
  • Vue 3 script-setup 语法糖不是银弹,需要根据项目规模和技术栈选择
  • Understanding underlying principles is more important than memorizing APIs

MIT Licensed