Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@terrierscript
Last active December 15, 2016 12:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save terrierscript/89bdacbc496cdc20bd49 to your computer and use it in GitHub Desktop.
Save terrierscript/89bdacbc496cdc20bd49 to your computer and use it in GitHub Desktop.
Reduxでのクライアントサイドvalidationをどこでやるべきか? ref: http://qiita.com/inuscript/items/5bed7812b3c1447b7b60
// 値は値でreducerに返す
export const appendTask = (task) => {
return {type: "TODO_ADD", payload: task}
}
// 別途、エラーがあれば、そちらもactionを生成する
export const checkTaskError = (task) => {
if(!isValidTodo(task)){
return {type: "ERROR_MESSAGE", payload: "Input Some word"}
}
return {type: "ERROR_MESSAGE", payload: ""}
}
class InputComponent extends Component{
:
handleClick(e){
:
this.props.actions.appendTask(currentInput)
// validation用にもactionを飛ばす
this.props.actions.checkTaskError(currentInput)
:
const errorMessage = (state = null, action) => {
switch(action.type) {
case "TODO_ADD":
if(!isValidTodo(action.payload)){
return "Invalid Task"
}
}
return state
}
handleClick(e){
let currentInput = this.state.currentInput
// validationエラーをstateでやる
if(!isValidTodo(currentInput)){
this.setState({
errorMessage: "Input some word"
})
return
}
this.props.actions.appendTask(currentInput)
this.setState({
currentInput: ""
})
}
export const appendTask = (task) => {
// エラーかどうかで返すactionを変える
if(!isValidTodo(task)){
return {type: "ERROR_MESSAGE", payload: "Input Some word"}
}
return {type: "TODO_ADD", payload: task}
}
const doValidate = (action) => {
let errors = []
switch(action.type){
case "TODO_ADD":
if(!isValidTodo(action.payload)){
return "Invalid Task"
}
}
}
export const validateMiddleware = ({ dispatch, getStore }) => next => action => {
let error = doValidate(action)
if(error){
// errorがあったらerrorMsgのactionだけ発火させる
dispatch(actions.errorMsg(error))
return
}
let result = next(action)
return result
}
const tasks = (state = [], action) => {
switch (action.type) {
case 'TODO_ADD':
let task = action.payload
// validate通った時だけpushする
if(isValidTodo(task)){
state.push(task)
}
return state.concat()
case 'TODO_REMOVE':
:
export const isValidTodo = (task) => {
if(task === ""){
return false
}
return true
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment