Vue 计算属性和ref的使用方法

本文介绍了Vue.js中的计算属性和ref的使用。计算属性用于在模板中创建依赖于其他数据的值,当依赖的数据变化时,计算属性会自动更新。而ref则用于直接操作DOM元素,如在组件挂载后聚焦输入框。通过示例代码,展示了如何使用计算属性和ref实现特定功能。

1、计算属性

2、ref操作dom元素


1、计算属性

            1、使用场景:数据b依赖数据a时,b改成计算属性

            2、用法:b和data中数据用法一样,值:function(){return 复杂逻辑的结果}

            3、特点:依赖了a,a变 -> b自动变化  没有依赖a,第一次结果自动缓存

            4、和methods的区别:methods调用一次执行一次,如果没依赖a,只执行一次

<div id="app" v-cloak>
        {{msg}}
        <hr/>
        {{str}}
        <hr>
        <p>{{fn2}}</p>
        <p>{{fn2}}</p>
        <p>{{fn2}}</p>
        <p>{{fn1()}}</p>
        <p>{{fn1()}}</p>
        <p>{{fn1()}}</p>
    </div>
    <script src="vuejs-2.5.16.js"></script>
    <script>
        
        var vm = new Vue({
            el:"#app",
            data:{
                msg:"100",
              },
            //   定义计算属性,可以通过vm.msg修改data的msg值,str的值也会随之改变
              computed:{
                  str:function() {
                    console.log("fn2---")
                      return this.msg+"abc"
                  },
            fn2(){
                return new Date()
            }
        },
              methods:{
                    fn1(){
                        console.log("fn1---")
                        return new Date()
                    }
              }
        })
        
    </script>

2、ref操作dom元素:

            1、给要操作的dom元素 设置ref

            2、mounted(){this.$refs.ref属性的值.事件名}

   <div id="app" v-cloak>
//ref的值可以自定义,不过要和下面$refs后面的tdb值一同修改才不会报错
       <input type="text" ref="tdb">
    </div>
    <script src="vuejs-2.5.16.js"></script>
    <script>
        var vm = new Vue({
            el:"#app",
            data:{
              },
              mounted(){
                  this.$refs.tdb.focus()
              }
        })
    </script>

 运行结果就是一个输入框在刚加载的完成的时候就获得了焦点

好啦,又到了说再见的时候咯,拜拜啦

<think>我们正在讨论Vue中的计算属性。根据引用,计算属性Vue实例中一个重要的特性,用于对数据进行动态计算,并且具有缓存机制,只有当依赖发生改变时才会重新计算。在Vue3中,计算属性在Composition API中通过`computed`函数来定义。 计算属性使用方法: 1. 定义计算属性:在Vue组件中,我们可以使用`computed`函数(在Vue3的Composition API中)或`computed`选项(在Vue2或Vue3的Options API中)来定义计算属性。 2. 在模板中使用计算属性可以在模板中像普通属性一样使用,但它的值是基于其依赖的响应式数据计算而来的。 最佳实践: - 使用计算属性来处理模板中的复杂逻辑,避免在模板中写过多的表达式。 - 利用计算属性的缓存特性,避免重复计算,提高性能。 - 在Vue3中,推荐使用Composition API`<script setup>`语法糖来定义计算属性,这样更灵活。 另外,计算属性默认是只读的。如果你需要可写的计算属性,可以通过提供一个带有gettersetter的对象来实现。 现在,我们来看一个在Vue3中使用计算属性的例子(使用Composition API`<script setup>`): ```vue <script setup> import { ref, computed } from 'vue' const firstName = ref('John') const lastName = ref('Doe') // 只读计算属性 const fullName = computed(() => { return firstName.value + ' ' + lastName.value }) // 可写计算属性 const fullNameWritable = computed({ get() { return firstName.value + ' ' + lastName.value }, set(newValue) { [firstName.value, lastName.value] = newValue.split(' ') } }) </script> <template> <div> <p>只读计算属性:{{ fullName }}</p> <p>可写计算属性:<input v-model="fullNameWritable" /></p> </div> </template> ``` 在上面的例子中,我们定义了两个计算属性: 1. `fullName`:只读计算属性,它返回`firstName``lastName`的组合。 2. `fullNameWritable`:可写计算属性,我们提供了gettersetter。在setter中,我们将传入的新值拆分成两部分,分别赋值给`firstName``lastName`。 注意:在模板中,我们可以直接使用`v-model`绑定可写计算属性。 此外,根据引用[5],我们还可以结合侦听器(watch)来处理一些复杂的情况,比如防抖,但计算属性本身并不适合用于异步操作(因为计算属性必须是同步的)。如果有异步操作的需求,可以使用侦听器或者结合方法来实现。 总结: - 计算属性适用于基于响应式数据派生出的新数据,且具有缓存机制,效率高。 - 避免在计算属性中做异步操作或产生副作用(如修改DOM)。 - 当需要可写计算属性时,通过提供gettersetter来实现。 相关问题: 1. 计算属性方法(methods)有什么区别? 2. 在什么情况下应该使用侦听器(watch)而不是计算属性? 3. Vue3中计算属性在Composition APIOptions API中的使用方式有何不同? 4. 如何为计算属性添加类型(TypeScript)?</think>### Vue 计算属性使用指南与最佳实践 计算属性(computed)是 Vue 响应式系统的核心特性,用于声明式处理数据逻辑。以下为详细使用方法最佳实践: #### 一、核心使用方法 1. **基础定义**(Composition API): ```vue <script setup> import { ref, computed } from 'vue' const price = ref(100) const quantity = ref(2) // 计算属性定义 const total = computed(() => price.value * quantity.value) </script> <template> <p>总价: {{ total }}</p> </template> ``` 2. **可写计算属性**(需提供 setter): ```vue const fullName = computed({ get() { return `${firstName.value} ${lastName.value}` }, set(newValue) { [firstName.value, lastName.value] = newValue.split(' ') } }) ``` 3. **Options API 用法**: ```javascript export default { data() { return { price: 100, quantity: 2 } }, computed: { total() { return this.price * this.quantity } } } ``` #### 二、最佳实践 1. **缓存优化** 计算属性自动缓存结果,依赖项不变时直接返回缓存值,避免重复计算[^1][^3]。 2. **避免副作用** 计算属性应是纯函数,不要在其中执行异步操作或修改外部状态[^3]。 3. **复杂逻辑拆分** 当逻辑复杂时,可组合多个计算属性: ```javascript const discountedPrice = computed(() => price.value * 0.9) const finalTotal = computed(() => discountedPrice.value * quantity.value) ``` 4. **性能敏感场景** 对于大数据量操作(如数组过滤/排序),优先使用计算属性而非方法(methods),利用缓存机制提升性能[^2][^5]。 5. **TypeScript 类型标注**: ```typescript const total = computed<number>(() => price.value * quantity.value) ``` #### 三、与侦听器(watch)的选择 | 场景 | 使用计算属性 | 使用侦听器 | |---------------------|-------------|-----------| | 派生数据 | ✓ | ✗ | | 异步操作 | ✗ | ✓ | | 响应数据变化执行操作| ✗ | ✓ | | 高性能数据转换 | ✓ | ✗ | > 示例:购物车总价计算推荐使用计算属性,而搜索请求建议使用侦听器+防抖[^5]。 #### 四、常见误区 1. **修改计算属性** 默认只读,修改需通过 setter 实现[^4]。 2. **过度使用** 简单表达式可直接在模板中书写,无需封装: ```vue <!-- 推荐 --> <p>{{ price * quantity }}</p> <!-- 不推荐(过度封装) --> <p>{{ total }}</p> ``` 3. **依赖非响应式数据** 确保计算属性依赖的都是响应式数据(ref/reactive)。 **总结**:计算属性是处理派生数据的首选方案,通过合理利用其缓存特性组合能力,可显著提升代码可维护性应用性能[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值