React/Redux,如何获得用户输入

use*_*958 6 javascript reactjs redux

我正在使用React Redux教程.我真正没有得到的是如何检索用户输入.

他们构建了一个FilterLink容器,其mapDispatchToProps是

const mapDispatchToProps = (dispatch, ownProps) => {
  return {
    onClick: () => {
      dispatch(setVisibilityFilter(ownProps.filter))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

因此它将自己的Pop.filter注入连接的表示组件.如果我们去看看这个容器是如何构建的

const Footer = () => (
  <p>
    Show:{" "}
    <FilterLink filter="SHOW_ALL">All</FilterLink>{", "}
    <FilterLink filter="SHOW_ACTIVE">Active</FilterLink>{", "}
    <FilterLink filter="SHOW_COMPLETED">Completed</FilterLink>
  </p>
)
Run Code Online (Sandbox Code Playgroud)

好的,有"过滤器"属性.这很清楚.

现在我想在同一个例子上构建一个文本过滤器.首先,这是我的表现部分

const TodoSearch = ({onSubmit}) => (
    <form
        onSubmit={e => {
            e.preventDefault()
            onSubmit()
        }}
    >
        <input placeholder="Text search" />
        <input type="submit" value="Go" />
    </form>
)
Run Code Online (Sandbox Code Playgroud)

但是当我来写容器时,我不知道如何获得用户输入

const mapDispatchToProps = (dispatch) => {
    return {
        onSubmit: () => {
            dispatch(setTextSearch(????))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我用jQuery $(#text).val()做的事情,但......这是最好的方法吗?

稍后在同一个教程中,他们构建了一个小表单来向列表中添加待办事项.好的,我们去看看他们如何捕获输入.

let AddTodo = ({ dispatch }) => {
    let input

    return (
        <div>
            <form onSubmit={e => {
                e.preventDefault()
                if (!input.value.trim()) {
                    return
                }
                dispatch(addTodo(input.value))
                input.value = ''
             }}>
                 <input ref={node => {
                     input = node
                 }} />
                 <button type="submit">
                    Add Todo
                 </button>
            </form>
        </div>
    )
}
Run Code Online (Sandbox Code Playgroud)

等等,这里的魔力在哪里?他们是否通过引用技巧为"输入"变量注入了价值?那是对的吗?那么如果有20个输入字段,我是否可以使用20个不同引用的20个变量?

感谢任何帮助,谢谢

gar*_*ajo 3

将您的提交功能更改为以下内容。

const mapDispatchToProps = (dispatch) => {
    return {
        onSubmit: (evt) => {
            dispatch(setTextSearch(evt.target.querySelector('input').value)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

还,

const TodoSearch = ({onSubmit}) => (
    <form
        onSubmit={e => {
            e.preventDefault()
            onSubmit(e)
        }}
    >
        <input placeholder="Text search" />
        <input type="submit" value="Go" />
    </form>
)
Run Code Online (Sandbox Code Playgroud)