여기 내 감속기에서 돌연변이를 불러 일으키는 반응 무 상태 함수가 있습니다. 참고로, React.Component 클래스 내에서 돌연변이를 호출하는 것은 구성 요소 내부에 함수를 추가하여 작동합니다. 그럴 필요가 없습니다. 내 감속기를 사용하고 싶습니다.Redux Reducer에서 GraphQL Mutation을 사용하는 방법
최소 코드 예제와, 내 설치
// index.js render function
[...] // imported variables
<ApolloProvider client={client}>
<Provider store={store}>
<ConnectedRouter history={history}>
<div>
<App />
</div>
</ConnectedRouter>
</Provider>
</ApolloProvider>
// Mutation
const Foo = gql`
mutation Foo($id: String) {
AddBar(id: $id) {
id
}
}
`;
// Component
[...] // other imports for below variables
const Comp = (props) => (
<div>
<button onClick={() => props.addFoo(props)}>Click</button>
</div>
)
const mapDispatchToProps = dispatch => bindActionCreators({
addFoo
}, dispatch)
export default connect(
mapDispatchToProps
)(graphql(Foo)(Comp))
// Reducer (very slimmed with just the action)
export const addFoo = (props) => {
// props contained the mutate function
props.mutate({
variables: {id: "1" }
})
// dispatch goes here but not needed.
}
좋아 보여주지, 나는 가능한 한 많은이 예제를 다운 몸매는 여전했다. 내 문제는 내 변수가 내 mutation 함수로 전달되지 않는다는 것입니다. id
을 하드 코드하여 단추를 클릭하면 graphql이 내 데이터를 변경하지만 (예) 변수가 전달되지 않는 유일한 문제입니다. 관리자에서는 올바른 값을 가진 변수를 보지만 ... mutate 함수로 전달하지 않습니다.
내 감속기에 돌연변이 기능을해서는 안되며 구성 요소에 있어야한다고 말하고 있습니까? – Sylar
정확하지 않습니다. 나는 당신이 당신의 감속기에 돌연변이 기능을 가져서는 안되며 그것이 어디로 가야하는지에 대한 의견을 말하지 말아야한다고 말하고 있습니다. Reducers에는 부작용이 없어야하므로 비동기 호출을하거나 절대로 수정해서는 안됩니다. 그것들은 input => state의 순수한 변환이어야합니다. 그 후에 돌연변이를 어디서 할 것인지 결정할 수 있습니다. Redux 수준에서 원한다면 Redux Thunks를 통해 "Action Creator"메커니즘을 선호합니다. 당신은'apolloClient.mutate()'를 사용하여 그것을 넣을 수있다. 당신이 그것을 React 레이어에 보관하고 싶다면 그것은 괜찮습니다. 그리고 당신이해야 할 일이별로 없습니다. –
당신이 옳다고 생각합니다. 나는 redux에서 모든 로직을 제거하고 graphql을 별도로 유지할 것이다. 감사. BTH, 당신의 구현은 작동하지만 Redux와 분리 할 것입니다. – Sylar