109.vue中匿名函数的写法和注意事项

countstore.js

import { defineStore } from 'pinia'

/**
 * 定义一个名为 count 的 Store
 * 使用 Option Store(选项式)写法
 */
const piniaCountStore = defineStore('count', {
  
  state:()=>{
    return {
      count:10
    }
  }
  
  ,
  getters:
  {
     getCount:(state)=>"当前count的值"+state.count,
     doubleCount(state){
      return this.getCount+state.count
    }
  }
      
     
  }
)

export default piniaCountStore

相当的经典:

五、总结(请刻在脑子里)

  1. {}是对象:在 JavaScript 中,大括号 {}用来创建对象。

  2. getters: {}是键值对:冒号左边是属性名(getters),右边是属性值(一个对象)。

  3. Pinia 的约定

    • state的值是 函数(因为要防止数据互相污染)。

    • getters的值是 对象(因为可能有多个计算属性)。

    • actions的值是 对象(因为可能有多个操作方法)。

记忆口诀:

Option Store 像填表,State 是函数 Getters 是对象。

对象里面装方法,键值对应莫忘掉。

 

key:vaule

getters是一个属性名,key的名称是getters,value的值{},{}表示的是一个对象,对象里面可以定义多个方法

getCount:(state)=>"当前count的值"+state.count,
可以的名称是getcount,:右边vaule的值是一个函数,函数必须是要有返回值的,()=>是一个匿名函数



这是一个非常精准的观察点。你抓住了 Pinia Getter 中最经典的箭头函数简写形式

我们来像剥洋葱一样,把 getCount: (state) => "当前count的值" + state.count彻底拆开:


一、整体定性:这是一个“对象属性的赋值”

首先,它位于一个对象 {}内部:

getters: {
  getCount: (state) => "当前count的值" + state.count
}

所以,它的完整结构是:

  • 属性名(Key)getCount

  • 属性值(Value)(state) => "当前count的值" + state.count

结论:你把一个箭头函数赋值给了 getters对象的 getCount属性。


二、拆解箭头函数本身

1. 函数名

  • 它没有名字

  • 我们通常叫它 匿名函数

  • 它通过 getCount这个属性名被引用和调用(例如 store.getCount)。

  • 这就像一个人虽然没有户口上的大名,但他有绰号“胖虎”,大家叫绰号也能找到他。

2. 参数列表

(state) =>
  • 它接收一个参数。

  • 参数名叫 state

  • Pinia 在调用这个函数时,会自动把当前的 state对象传进去

  • 所以你在函数体内才能使用 state.count

3. 函数体(核心)

=> "当前count的值" + state.count

这是箭头函数特有的简写语法

  • 因为没有花括号 {},所以函数体只有一行。

  • 这一行代码的计算结果("当前count的值10")会被自动返回

  • 它等价于:

    => { return "当前count的值" + state.count }

三、它在 Pinia 中是如何被调用的?

当你在组件中写下:

<p>{{ store.getCount }}</p>

发生了以下步骤:

  1. Vue 发现你在读取 store.getCount

  2. Pinia 知道 getCount是一个 Getter(函数)。

  3. Pinia 自动调用这个函数:getCount(state)

  4. Pinia 把当前的 state对象作为参数传入。

  5. 函数执行,返回字符串 "当前count的值10"

  6. Vue 把这个字符串渲染到页面上。

注意:你不需要手动写 store.getCount()(加括号)。Pinia 帮你处理了调用过程,让你感觉它像是一个属性,而不是方法。


四、这种写法的“能”与“不能”

✅ 它能做到的:

  • 访问 State:通过参数 state,完美。

  • 进行计算:拼接字符串、数学运算等。

  • 自动返回:代码简洁。

❌ 它不能做到的:

  • 不能使用 this

    // ❌ 错误!箭头函数没有自己的 this,这里的 this 不是 Store 实例
    getCount: (state) => this.someOtherGetter
  • 不能调用其他 Getter/Actions:因为不能用 this

  • 不能写复杂逻辑:因为只有一行代码(除非你用 {}包裹并手写 return,但那样就失去了简写的意义)。


五、对比:三种等价写法(从繁到简)

为了让你的理解更透彻,看这三种写法是完全等价的:

写法一:最传统(ES5)

getters: {
  getCount: function(state) {
    return "当前count的值" + state.count
  }
}

写法二:对象方法简写(ES6,推荐用于复杂逻辑)

getters: {
  getCount(state) {
    return "当前count的值" + state.count
  }
}

写法三:箭头函数简写(你当前的写法,适合一行搞定)

getters: {
  getCount: (state) => "当前count的值" + state.count
}

六、总结(核心要点)

  1. 身份:它是赋值给 getCount属性的匿名箭头函数

  2. 参数state由 Pinia 自动注入,代表当前状态。

  3. 返回值:箭头后面的一行代码结果即为返回值(return被省略)。

  4. 限制无法使用 this,因此只能访问 state,不能访问其他 Getter 或 Action。

  5. 适用场景简单、纯数据的计算(如格式化、拼接、简单数学运算)。

记忆口诀

箭头函数作属性,state 参数自动传。

单行代码隐返回,唯独缺了 this 伴。

你现在已经能精准地分析这一行了,这说明你对 JavaScript 函数和基础语法的理解正在飞速加深!👍

这是一个非常本质的 JavaScript 问题,也是理解 Vue 和 Pinia 的核心钥匙

{}在这里是 对象字面量(Object Literal)

我分三层给你讲:表层(Vue/Pinia 视角)→ 中层(JS 语法视角)→ 底层(为什么必须这样)


一、表层:Vue/Pinia 的“配置对象”

在 Pinia 的 Option Store 写法里:

defineStore('count', {
  // ↑ 这是一个大对象(配置对象)
  state() { ... },
  getters: { ... }, // ← 这里的 {} 也是一个对象
  actions: { ... }  // ← 这里的 {} 也是一个对象
})

你可以把整个 defineStore的第二个参数看作一份“配置清单”

这份清单里有三个栏目:

  1. state 栏目:填一个函数(用来返回数据)。

  2. getters 栏目:填一个对象(用来放各种计算逻辑)。

  3. actions 栏目:填一个对象(用来放各种操作方法)。

所以,getters: { ... }的意思是:

getters这个属性的值,是一个对象。


二、中层:拆解 { ... }里面的内容

这个 {}里面放的是 “键值对(Key-Value Pairs)”

getters: {
  // 键(函数名): 值(函数体)
  getCount(state) { 
    return "当前count的值" + state.count 
  },
  doubleCount(state) {
    return this.getCount + state.count
  }
}

这其实就是标准的 JavaScript 对象定义:

const person = {
  name: "张三",          // 键值对(值是字符串)
  age: 18,              // 键值对(值是数字)
  sayHi() {             // 键值对(值是函数)
    console.log("Hi")
  }
}

Pinia 的 getters 对象,跟你定义的 person对象,在语法结构上是一模一样的。


三、底层:为什么不能是箭头函数 =>

这是你刚才犯错的核心原因。对比一下:

❌ 错误的写法(你刚才写的):

// 这是把一个“箭头函数”赋值给了 getters
getters: (state) => "当前count的值" + state.count
  • 这等于告诉 Pinia:getters是一个函数

  • 但 Pinia 期望的是:getters是一个装满了函数的容器(对象)

  • 就像 HR 让你交一份通讯录(名单),你却交了一个电话(只有一个号码)。

✅ 正确的写法:

// 这是把一个“对象”赋值给了 getters
getters: {
  getCount(state) { ... },
  doubleCount(state) { ... }
}
  • 这等于告诉 Pinia:getters是一个对象

  • 这个对象里面有两个方法(getCountdoubleCount)。

  • 就像 HR 拿到了通讯录,里面有好多联系人名单。


四、一个最形象的比喻

想象你在组装一台电脑(定义 Store):

  • state​ 是 内存条(一个硬件,用一个函数返回它):

    state: () => ({ count: 10 })
  • getters​ 是 软件工具箱(里面有很多工具,所以必须是个箱子/对象):

    getters: {
      toolA() {}, // 螺丝刀
      toolB() {}  // 扳手
    }
  • actions​ 是 操作面板(上面有很多按钮,所以也必须是个面板/对象):

    actions: {
      doA() {}, // 开机键
      doB() {}  // 重启键
    }

你不可能把“工具箱”本身变成一个“螺丝刀”(箭头函数),你只能把“螺丝刀”放进“工具箱”(对象)里。


五、总结(请刻在脑子里)

  1. {}是对象:在 JavaScript 中,大括号 {}用来创建对象。

  2. getters: {}是键值对:冒号左边是属性名(getters),右边是属性值(一个对象)。

  3. Pinia 的约定

    • state的值是 函数(因为要防止数据互相污染)。

    • getters的值是 对象(因为可能有多个计算属性)。

    • actions的值是 对象(因为可能有多个操作方法)。

记忆口诀:

Option Store 像填表,State 是函数 Getters 是对象。

对象里面装方法,键值对应莫忘掉。

理解了这一点,你就理解了 Vue 2、Vue 3(选项式)、Pinia(选项式)​ 的共同语法基础。这是前端进阶的必经之路!👍

 

上面的代码中

  state:()=>{
    return {
      count:10
    }
  }
 
可以修改成下面的形式
 state(){
    return {
      count:10
    }
  }
 
import { defineStore } from 'pinia'

/**
 * 定义一个名为 count 的 Store
 * 使用 Option Store(选项式)写法
 */
const piniaCountStore = defineStore('count', {
  
  state(){
    return {
      count:10
    }
  }
  
  ,
  getters:
  {
     getCount:(state)=>"当前count的值"+state.count,
     doubleCount(state){
      return this.getCount+state.count
    }
  }
      
     
  }
)

export default piniaCountStore

也可以修改成下面的形式,就是要能够看的懂代码

import { defineStore } from 'pinia'

/**
 * 定义一个名为 count 的 Store
 * 使用 Option Store(选项式)写法
 */
const piniaCountStore = defineStore('count', {
  
  state(){
    return {
      count:10
    }
  }
  
  ,
  getters:
  {
     getCount(state){
       return "当前count的值"+state.count
     },
     doubleCount(state){
      return this.getCount+state.count
    }
  }
      
     
  }
)

export default piniaCountStore
import { defineStore } from 'pinia'

/**
 * 定义一个名为 count 的 Store
 * 使用 Option Store(选项式)写法
 */
const piniaCountStore = defineStore('count', {
  
  state(){
    return {
      count:10
    }
  }
  
  ,
  getters:
  {
     getCount(state){
       return "当前count的值"+state.count
     },
     doubleCount(state){
      return this.getCount+state.count
    }
  },
  actions:{
    
    addCount(state){
      this.count +=10 
    },
    decrease(state){
      this.count-=5
    }

  }
      
     
  }
)

export default piniaCountStore

 

app.vue

<template>
  <h1>app vue</h1>
  <hello />
</template>

<script setup>
// 引入子组件
import hello from './components/hello.vue'
</script>

<style scoped>
h1 {
  color: #42b983;
}
</style>

hello.vue的代码如下

<template>
  <p>hello.vue</p>
  <p>count: {{ store.count }}</p>

  <p>hello22.vue</p>
  <p>count: {{ store.doubleCount }}</p>
  <p>{{ store.getCount }}</p>
  <!-- 可选:修改数据 -->
  <button @click="store.count++">+1</button>
  <button @click="store.addCount">+10</button>
  <button @click="store.decrease">-5</button>
</template>

<script setup>
// 引入 store
import piniaCountStore from '../store/countstore'

// 调用 store(注意:是函数调用)
const store = piniaCountStore()
</script>

<style scoped>
p {
  font-size: 18px;
}
</style>

程序运行的效果如下所示

image

 

比如我点中间的+10按钮,值就变成了下面的形式

image

 

posted on 2026-07-14 20:38  luzhouxiaoshuai  阅读(5)  评论(0)    收藏  举报

导航