Vuex 方法风格的访问获取器
Vuex Method-style Access Getters
我有点难以理解以下 JS:
const store = new Vuex.Store({
state: {
todos: [
{ id: 1, text: '...', done: true },
{ id: 2, text: '...', done: false }
]
},
getters: {
// ...
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
}
}
})
store.getters.getTodoById(2) // -> { id: 2, text: '...', done: false }
这两段代码摘自官方 Vuex 文档on Method Style Access for Getters。
现在我不明白的是,代码的第二部分是如何输出注释中的值的?可能是我没看懂 JS 函数?
我相信输出会是:
(id) => {
return state.todos.find(todo => todo.id === id)
}
所以实际上返回的是第二个函数,因为在他们使用的调用中,我没有看到两个 '()()'
也不知道函数从哪里接收 'state'
变量.
我想请教一个解释,是我误解了 JS 中的某些东西,还是 Vuex 特有的东西?
查看柯里化箭头函数示例:
然而,当我们考虑到 vuex getter 方法时,它的工作原理如下。
getters: {
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
}
}
- 我们在属性中定义了一个函数,叫做
getToboById
。
- 并且我们在调用第一个函数时定义了另一个函数。在示例
(id) => {}
中。这将采取我们的说法。
- 第一个声明的
(state)
部分。如果我们采用常规 getter 而不采用参数。我们总是可以访问 state
参数。 Vuex 为每个 getter 函数提供了这个。
- 所以当我们调用以下内容时:
store.getters.getTodoById(2)
。你实际上在做 store.getters.getTodoById()(2)
。在第一个函数调用中,您已经包含了状态。
所以,总结一下:
这个函数调用 store.getters.getTodoById()
将 return 我们一个函数。我们可以用我们的论点再次调用它。
并且根据链接的示例将如下所示:
getTodoById: function(state) {
return function(id) {
return state.todos.find(todo => todo.id === id);
}
}
这里涉及到“函数的柯里化”,简单来说:
//①
const add = (x, y) => x + y;
add(2,3) // 5
此代码的柯里化将是:
//②
const add = x => y => x + y;
转成ES5代码是这样的:
const add = function(x){
在那:
getters: {
//...
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
}
}
可以写成它的等价形式(就像②和①等价):
getters: {
//...
getTodoById: (state,id) => {
return state.todos.find(todo => todo.id === id)
}
}
state参数是getters的默认参数,所以可以这样调用:
store.getters.getTodoById(2);
参考:
我有点难以理解以下 JS:
const store = new Vuex.Store({
state: {
todos: [
{ id: 1, text: '...', done: true },
{ id: 2, text: '...', done: false }
]
},
getters: {
// ...
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
}
}
})
store.getters.getTodoById(2) // -> { id: 2, text: '...', done: false }
这两段代码摘自官方 Vuex 文档on Method Style Access for Getters。
现在我不明白的是,代码的第二部分是如何输出注释中的值的?可能是我没看懂 JS 函数?
我相信输出会是:
(id) => {
return state.todos.find(todo => todo.id === id)
}
所以实际上返回的是第二个函数,因为在他们使用的调用中,我没有看到两个 '()()'
也不知道函数从哪里接收 'state'
变量.
我想请教一个解释,是我误解了 JS 中的某些东西,还是 Vuex 特有的东西?
查看柯里化箭头函数示例:
然而,当我们考虑到 vuex getter 方法时,它的工作原理如下。
getters: {
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
}
}
- 我们在属性中定义了一个函数,叫做
getToboById
。 - 并且我们在调用第一个函数时定义了另一个函数。在示例
(id) => {}
中。这将采取我们的说法。 - 第一个声明的
(state)
部分。如果我们采用常规 getter 而不采用参数。我们总是可以访问state
参数。 Vuex 为每个 getter 函数提供了这个。 - 所以当我们调用以下内容时:
store.getters.getTodoById(2)
。你实际上在做store.getters.getTodoById()(2)
。在第一个函数调用中,您已经包含了状态。
所以,总结一下:
这个函数调用 store.getters.getTodoById()
将 return 我们一个函数。我们可以用我们的论点再次调用它。
并且根据链接的示例将如下所示:
getTodoById: function(state) {
return function(id) {
return state.todos.find(todo => todo.id === id);
}
}
这里涉及到“函数的柯里化”,简单来说:
//①
const add = (x, y) => x + y;
add(2,3) // 5
此代码的柯里化将是:
//②
const add = x => y => x + y;
转成ES5代码是这样的:
const add = function(x){
在那:
getters: {
//...
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
}
}
可以写成它的等价形式(就像②和①等价):
getters: {
//...
getTodoById: (state,id) => {
return state.todos.find(todo => todo.id === id)
}
}
state参数是getters的默认参数,所以可以这样调用:
store.getters.getTodoById(2);
参考: