在Meteor中点击创建元素

时间:2016-05-13 18:41:49

标签: meteor reactjs

我正在使用Meteor和React。我有一个非常简单的目标,但我已经尝试了很多,并不能为自己解决它。我将在下面向您展示我的尝试。

我想为Ingredients创建一个表单。在第一时刻,只有一个输入(仅一种成分)和2个按钮:添加成分并提交。

class IngredientForm extends Component {
  render() {
    return(

      <form onSubmit={this.handleSubmit.bind(this)}>

        <input type="text"/>

        { this.renderOtherInputs() }

        <input type="button" value="Add Ingredient" onClick={this.addIngredient.bind(this)}>

        <input type="submit" value="Submit Form">

      </form>
    );
  }
}

因此,当我单击Submit时,所有数据都将转到集合中。当我单击Add Ingredient时,会出现另一个文本输入(在renderOtherInputs()的位置。

我知道,Meteor 被动 - 所以不需要直接渲染。我应该成为无效数据存储的基础。

我从教程中知道了渲染内容的唯一方法 - 我应该有一个数组(基于集合,总是被动的),然后为每个元素呈现阵列。

所以我应该有一个元素数量=附加输入数量的数组。这是本地的,所以我不能使用Collection,让我们使用 Reactive Var 而不是它。

numOfIngredients = new ReactiveVar([]);

当我单击Add按钮时 - 应该将新元素推送到此数组:

addIngredient(e) {
    e.preventDefault();
    let newNumOfIngredients = numOfIngredients.get();
    newNumOfIngredients.push('lalal');
    numOfIngredients.set(newNumOfIngredients);
}

毕竟我应该渲染额外的输入(假设我在阵列中有多少元素):

renderOtherInputs() {
  return numOfIngredients.get().map((elem) => {
    return(
      <input type="text"/>
    );
  }
}

我的想法是:当我单击Add按钮时,新元素将被推送到ReactiveVar(newNumOfIngredients)。在html代码中,我调用this.renderOtherInputs(),它返回html作为我在ReactiveVar(newNumOfIngredients)中的元素的输入。 newNumOfIngredients是数据的反应存储 - 所以当我将元素推送到它时,所有依赖它的东西都应该重新渲染。我不知道为什么那不起作用以及如何做到这一点。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

最后我得到了解决方案。但是你们为什么不帮助新手上网呢?这对于经验丰富的开发人员来说真的很简我读过流星,特别是反应有强大的社区,但是......

答案是:我们应该使用州!

首先让我们在react组件的构造函数中定义我们的状态对象:

constructor(props) {
  super(props);
  this.state = {
    inputs: [],
  }
}

然后我们需要一个函数来渲染state.inputs的输入:

renderOtherInputs() {
  return this.state.inputs.map( (each, index) => {
    return (
      <input key={ index } type="text" />
    );
  });
} 

并添加输入:

addInput(e) {
  e.preventDefault();
  var temp = this.state.inputs;
  temp.push('no matter');
  this.setState({
    inputs: temp,
  });
}

P.S。并删除每个输入:

deleteIngredient(e) {
  e.preventDefault();
  let index = e.target.getAttribute('id');
  let temp = this.state.inputs;
  delete temp[index];
  this.setState({
    inputs: temp,
  });
}