官方文档及尤雨溪提到过 ,ref 一把梭,不建议用 reactive。我说的话不可信,尤雨溪的话百分百可信,用,用,用ref一把梭。
ref
- 你的"万能工具箱"
javascript
// 什么都能装!
const name = ref('张三') // ✅ 字符串
const age = ref(18) // ✅ 数字
const isLoading = ref(false) // ✅ 布尔值
const user = ref({name: '李四'}) // ✅ 对象
const list = ref([]) // ✅ 数组
// 用的时候要加 .value
name.value = '王五'
age.value = 20
reactive
- 你的"对象专用盒"
javascript
// 只能装对象!
const user = reactive({ // ✅ 对象
name: '张三',
age: 18
})
const form = reactive({ // ✅ 对象
username: '',
password: ''
})
const list = reactive([]) // ✅ 数组(其实也是对象)
// 用的时候直接点属性
user.name = '李四'
form.username = 'admin'
关键区别:重新赋值问题
场景:从后台请求数据
❌ reactive
的错误用法:
javascript
// 初始化
let list = reactive(['苹果', '香蕉'])
// 模拟请求数据
setTimeout(() => {
const newData = ['西瓜', '葡萄', '芒果']
// ❌ 错误!这样会丢失响应式!
list = newData
// 页面不会更新!因为 list 的"监听器"断了
}, 1000)
✅ ref
的正确用法:
javascript
// 初始化
const list = ref(['苹果', '香蕉'])
// 模拟请求数据
setTimeout(() => {
const newData = ['西瓜', '葡萄', '芒果']
// ✅ 正确!通过 .value 重新赋值
list.value = newData
// 页面正常更新!
}, 1000)
✅ reactive
的正确用法(如果非要用):
javascript
const state = reactive({
list: ['苹果', '香蕉']
})
setTimeout(() => {
const newData = ['西瓜', '葡萄', '芒果']
// ✅ 正确!只改属性,不改对象本身
state.list = newData
}, 1000)
📝 实战选择指南
情况1:基础数据 → 必须用 ref
javascript
// ✅ 用 ref
const count = ref(0)
const name = ref('')
const isVisible = ref(true)
// ❌ reactive 会报错!
// const count = reactive(0) // 报错!
情况2:需要重新赋值 → 必须用 ref
javascript
// 从API获取数据
const data = ref(null)
const fetchData = async () => {
const result = await api.getData()
data.value = result // ✅ 可以重新赋值
}
// 切换页面数据
const currentPageData = ref([])
const changePage = (page) => {
currentPageData.value = getDataByPage(page) // ✅ 可以重新赋值
}
情况3:固定对象,只改属性 → 可以用 reactive
javascript
// 表单数据 - 通常不会整个替换
const form = reactive({
username: '',
password: '',
remember: false
})
// 用户信息 - 通常不会整个替换
const userInfo = reactive({
name: '张三',
age: 25,
avatar: ''
})
情况4:不确定用哪个 → 无脑用 ref
javascript
// 安全第一!
const something = ref(初始值)
🎯 黄金法则
- 处理数字、字符串、布尔值? → 用
ref
- 需要
xxx = 新数据
这样赋值? → 用ref
- 只是一个固定对象,只改里面的属性? → 可以考虑
reactive
- 不确定? → 直接用
ref
记住:ref
永远不会错,reactive
有时候会坑你!
官方文档及尤雨溪提到过 ,ref 一把梭,不建议用 reactive。我说的话不可信,尤雨溪的话百分百可信,用,用,用ref一把梭。不服,不服你不用打我,去打他🤣