【问题标题】:How do I get the value when using useState outside of the function?在函数之外使用 useState 时如何获取值?
【发布时间】:2020-11-27 18:01:28
【问题描述】:

我正在尝试在代码中采用这种形式并制作它,以便我可以将它放入数据中,以便我可以将其发布到我的数据库中。

有没有办法获取步骤 useState 的值并将其设置为状态?

这里是useState的具体功能

const StepInput = () => {
  const [steps, setSteps] = useState([{ value: null }]);

  function handleChange(i, event) {
    const values = [...steps];
    values[i].value = event.target.value;
    setSteps(values);
  }

  function handleAdd() {
    const values = [...steps];
    values.push({ value: null });
    setSteps(values);
  }

  function handleRemove(i) {
    const values = [...steps];
    values.splice(i, 1);
    setSteps(values);
  }

  return (
    <div>
      <button type="button" onClick={() => handleAdd()}>
        +
      </button>

      {steps.map((step, idx) => {
        return (
          <div key={`${step}-${idx}`}>
            <input
              type="text"
              placeholder="Enter Step"
              value={step.value || ""}
              onChange={e => handleChange(idx, e)}
            />
            <button type="button" onClick={() => handleRemove(idx)}>
              X
            </button>
          </div>
        );
      })}
    </div>
)
}

这就是它的名称。这是我将使用 Axios 发布数据的地方。

export default class RecipeCreationForm extends Component {
  constructor(props) {
      super(props)

      this.state = {
          recipe_name: "",
          recipe_difficulty: "",
      }
      this.handleChange = this.handleChange.bind(this);
  }

  handleChange(event) {
    this.setState({
      [event.target.name]: event.target.value,
      errorText: ""
    })
  }

  handleSubmit(event) {
      console.log(this.value.props.step)
  }

  render() {
      return (
          <div>
              <form>
                  <input 
                    className="input-box"
                    type="text"
                    name="recipe_name"
                    placeholder="Recipe Name"
                    value={this.state.recipe_name}
                    onChange={this.handleChange}
                  />
                  <input 
                    className="input-box"
                    type="text"
                    name="recipe_difficulty"
                    placeholder="Recipe difficulty 1-10"
                    value={this.state.recipe_difficulty}
                    onChange={this.handleChange}
                  />
                  <StepInput />
                  <button type="submit">Create Recipe</button>
              </form>
          </div>
      )
  }
}

【问题讨论】:

  • 你不应该将钩子与类基础组件混合,选择一个但不能同时选择两者。作为您不应该将一种状态复制到另一种状态的问题,这是不好的做法。保留一个单一的事实来源,使用steps 作为表单的道具。
  • 你建议我做什么?我在表单的其余部分使用状态,但我需要能够添加尽可能多的步骤。我似乎想不出办法。

标签: reactjs use-state


【解决方案1】:

我的朋友有很多方法。

对于这种情况,最简单和推荐的方法是为您的 步进输入。

// at RecipeCreationForm 
simpleCallback= (stepInpuData) =>{
// your code here
}

<StepInput simpleCallback={simpleCallback}


// on your step input file

const StepInput = ({simpleCallback}) =>{

  useEffect(() => {
    simpleCallback(steps)
  }, [steps])



对于更复杂的情况,你有 redux。

但你也可以使用 Apollo(Redux 太复杂了)

【讨论】:

  • 执行此操作时,我收到一条错误消息,提示未定义 simpleCallback。另外,这是全部在 StepInput.js 文件中,还是有些在一个文件中,有些在另一个文件中?
  • 我刚刚编辑了答案以匹配您的问题:)
猜你喜欢
  • 2021-08-19
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2022-08-17
  • 2017-04-26
相关资源
最近更新 更多