简体   繁体   English

根据变化的 state 变量在反应中显示多个动态输入字段?

[英]Display multiple dynamic input fields in react, based on a changing state variable?

So, I am building my first React app, that connects to a Flask backend.所以,我正在构建我的第一个 React 应用程序,它连接到 Flask 后端。 I have a specific functional component that fetches a dictionary from the Python program, and I have saved this in a state variable(done using useState, setVariables).我有一个特定的功能组件,可以从 Python 程序中获取字典,并且我已将其保存在 state 变量中(使用 useState、setVariables 完成)。 The object is of type object 是类型

{'A':'x', 'B':'y', 'C':2},

and these are variable , and each render needs to be dynamic, based only on this object.这些是可变的,并且每个渲染都需要是动态的,仅基于此 object。 Based on the current state of this object, I want to display key-value pairs of this object in基于这个object的当前state,我想在这个object中显示键值对

<label>insertkey</label>
<input type="text" name = "insertkey" value=insertvalue/>

In addition, I want to be able to save any changes made to these values, and write into the state variable, so that I can send them back to my Flask backend.此外,我希望能够保存对这些值所做的任何更改,并将其写入 state 变量,以便我可以将它们发送回我的 Flask 后端。

I tried looping through each, and inserting as follows:我尝试遍历每个,并插入如下:

const [fields, setFields] = useState({});
//intermediate code for fetching and setting the state 

useEffect(() => {
  for (const [key, value] of Object.entries(fields)) {
    console.log(`${key}:${value}`);
    insert = insert + `<label> ${key} </label> <input type = 'text' value = ${value} name = ${key} onChange=${changedData()}></input><br/>`
  }

  document.getElementById('fields_form').innerHTML = insert;
});
const changedData = (evt) => {
  setFields({ [evt.target.name]: evt.target.value });
  console.log(evt.target.value);
}

//some intermediate code

return (
  <div>
    <form onSubmit={submitFunction}>
      <p id='fields_form'>

      </p>
      <input type="submit" value="Submit"></input>
    </form>
  </div>
);

But when I do this, the state is set as 'Undefined'.但是当我这样做时,state 被设置为“未定义”。

I would love to hear about some ways to implement this.我很想听听一些实现这一点的方法。 Maybe it's a really small fix, and I'm missing it, or perhaps there is a different approach that could be more suitable.也许这是一个非常小的修复,我错过了它,或者也许有一种不同的方法可能更合适。

Simple:简单的:

const Form = () => {
  const [values, setValues] = useState({});
  const onChange = (e) => {
    const name = e.target.name;
    let value = e.target.value;
    setValues({ ...values, [name]: value });
  };
  const onSubmit = (e) => {
    // send data or save it to local store
    api.send(values)
  };
  return (
    <form encType="multipart/form-data">
      <input
        type="text"
        name="email"
        value={value["email"]}
        onChange={onChange}
      />
      <input
        type="text"
        name="subject"
        value={value["subject"]}
        onChange={onChange}
      />
      <input
        type="text"
        name="body"
        value={value["body"]}
        onChange={onChange}
      />
      >
      <button type="submit" onClick={onSubmit}>
        Save
      </button>
    </form>
  );
};

export default Form;
console.log(values);

It's your solution.这是你的解决方案。

const [fields, setFields] = useState({});
const [values, setValues] = useState({});

// some fetch logic

// happens on loading some data
// for example data structure look's like:
// fetchedData = {
//   email: 'email@placeholder'
//   subject: 'subject placeholder'
//   body: 'body placeholder'
// }
useEffect(() => {
  if (fetchedData) {
    setFields(fetchedData)
  }
}, [fetchedData]);

// happens on fields changed
useEffect(() => {
  if (fields) {
    setValues(fields)
  }
}, [fields]);


const changedData = (evt) => {
  setValues({ ...values, [evt.target.name]: evt.target.value });
}

return (
  <div>
    <form onSubmit={submitFunction}>
      {Object.keys(fields).map(_ => (
        <input
          type="text"
          name={_}
          value={values[_]}
          onChange={changedData}
        />
      ))}
      <input type="submit" value="Submit"></input>
    </form>
  </div>
);

可变/动态内容正在根据<div> - 为什么?</div><div id="text_translate"><p> 我在局部有一些意外行为,在 users/show.html.erb 中呈现了 9 次。 (访问<a href="http://www.nowdoing.com/users/2" rel="nofollow">www.nowdoing.com/users/2</a>了解我的意思。)这是部分的相关部分(出于调试目的,它很冗长):</p><pre> &lt;%= "object 1 = #{object.content}" %&gt; &lt;div id="float_have" style="display:none;"&gt; &lt;%= "object 2 = #{object.content}" %&gt; &lt;%= render:partial =&gt; 'nowposts/floatpost', :locals =&gt; {:object =&gt; object.content } %&gt; &lt;/div&gt; &lt;%= "object 3 = #{object.content}" %&gt; &lt;a href="#float_have" rel="facebox"&gt;Have!&lt;/a&gt; |</pre><p> 在 #1 框中,:object =&gt; "#nowreading book"</p><p> 在 #2 框中,:object =&gt; "#nowlistening song"</p><p> 尽管如此,当我加载我的网页时,我还是看到了以下内容:</p><pre> object 1 = "#nowreading book" object 2 = "#nowreading book" object 3 = "#nowreading book"</pre><p> 这对 box#1 来说是有意义的。 但以下内容对 box#2 没有意义:</p><pre> object 1 = "#nowlistening song" object 2 = "#nowreading book" *** this is wrong object 3 = "#nowlistening song"</pre><p> 有人可以向我解释为什么将“#{object.content}”放在facebox DIV 中会导致内容发生变化吗? 我觉得这种行为很奇怪。 非常感谢您的帮助!</p><p> - - 编辑 - -</p><p> 在 users/show.html.erb 中:</p><pre> &lt;%= render:partial =&gt; 'nowposts/nowpost', :locals =&gt; {:object =&gt; @nowreading, :object_link =&gt; @reading_link, :object_mode =&gt; "reading", :doing_img =&gt; @reading_img, :doing_url =&gt; @reading_url_text } %&gt; &lt;%= render:partial =&gt; 'nowposts/nowpost', :locals =&gt; {:object =&gt; @nowlistening, :object_link =&gt; @listening_link, :object_mode =&gt; "listening", :doing_img =&gt; @listening_img, :doing_url =&gt; @listening_url_text } %&gt;</pre><p> 在 nowposts/_nowpost.html.erb 中:</p><pre> &lt;div class ="status bl br"&gt; Fresh on &lt;%= object.updated_at.strftime("%b %d, %Y") %&gt;&lt;br \&gt; &lt;% if user_signed_in? %&gt; &lt;%= "object 1 = #{object.content}" %&gt; &lt;div id="float_have" style="display:none;"&gt; &lt;%= "object 2 = #{object.content}" %&gt; &lt;%= render:partial =&gt; 'nowposts/floatpost', :locals =&gt; {:object =&gt; object.content } %&gt; &lt;/div&gt; &lt;div id="float_wanna" style="display:none;"&gt; &lt;%= "object 3 = #{object.content}" %&gt; &lt;%= render:partial =&gt; 'wishlists/floatpost', :locals =&gt; {:object =&gt; object.content } %&gt; &lt;/div&gt; &lt;a href="#float_have" rel="facebox"&gt;Have!&lt;/a&gt; | &lt;a href="#float_wanna" rel="facebox"&gt;Wanna!&lt;/a&gt; &lt;% end %&gt; &lt;/div&gt;</pre><p> 在 application.html.erb 中:</p><pre> &lt;script type="text/javascript"&gt; jQuery(document).ready(function($) { $('a[rel*=facebox]').facebox({ loadingImage: '../images/loading.gif', closeImage: '../images/closelabel.png' }) }) &lt;/script&gt;</pre><p> 部分 nowposts/_floatpoast.html.erb</p><pre> &lt;h2&gt;Wanna?&lt;/h2&gt; &lt;h3&gt;You wanna do this, Great. put it on your bucket list: &lt;/h3&gt; &lt;%= form_for(,wishlist: ,as =&gt; @wishlist: :url =&gt; {,controller =&gt; "wishlists": ,action =&gt; "create": .user_id =&gt; current_user } ) do |f| %&gt; &lt;p&gt;&lt;%= f:label.content %&gt;&lt;br /&gt; &lt;%= f:text_field,content: ,value =&gt; object: .size =&gt; "80" %&gt;&lt;/p&gt; &lt;p&gt;&lt;%= f.submit "Post!" %&gt;&lt;/p&gt; &lt;% end %&gt;</pre><p> 正如我在下面的评论中提到的,在我实现 API 结果和这些嵌套路由的缓存之前,这段代码在我的最后一次提交(几天前)中工作:</p><pre> resources:users resources:nowposts, :only =&gt; [:have_create, :create, :new, :show] end</pre><p> 但我不认为这是问题所在。 我刚刚进行了另一个测试,并且 object.content 仅在我将其包含在此 div 中时才会更改:</p><pre> &lt;div id="float_have" style="display:none;"&gt;</pre><p> 我尝试了另一个随机 div:</p><pre> &lt;div id="status"&gt; &lt;%= "object 2 = #{object.content}" %&gt; &lt;/div&gt;</pre><p> 这显示正确。 这让我觉得问题出在 Facebox 脚本上? 但如果是这样,我想知道为什么它在几天前起作用了。</p><p> 需要帮助请叫我。</p></div> - variable / dynamic content is changing based on <div> — why?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 根据状态中的可变数字显示输入字段 - Display input fields based on a variable number in state 如何根据变量显示一定数量的输入字段? - How could I display a certain number of input fields based on a variable? jQuery显示多个输入字段 - Jquery to display multiple input fields 从 2 个输入字段设置 React 组件的状态 - Setting the state of a React Component from 2 input fields 根据选择生成动态输入字段 - Generate dynamic input fields based on selection 根据下拉选项(js或PHP开关)更改多个输入字段的值 - Changing values of multiple input fields based on dropdown option (js or PHP switch) react js中的动态可编辑输入字段 - Dynamic Editable input fields in react js 更改输入字段类型时调整动态输入字段 - Adjusting dynamic input fields when changing the type of the input field 可变/动态内容正在根据<div> - 为什么?</div><div id="text_translate"><p> 我在局部有一些意外行为,在 users/show.html.erb 中呈现了 9 次。 (访问<a href="http://www.nowdoing.com/users/2" rel="nofollow">www.nowdoing.com/users/2</a>了解我的意思。)这是部分的相关部分(出于调试目的,它很冗长):</p><pre> &lt;%= "object 1 = #{object.content}" %&gt; &lt;div id="float_have" style="display:none;"&gt; &lt;%= "object 2 = #{object.content}" %&gt; &lt;%= render:partial =&gt; 'nowposts/floatpost', :locals =&gt; {:object =&gt; object.content } %&gt; &lt;/div&gt; &lt;%= "object 3 = #{object.content}" %&gt; &lt;a href="#float_have" rel="facebox"&gt;Have!&lt;/a&gt; |</pre><p> 在 #1 框中,:object =&gt; "#nowreading book"</p><p> 在 #2 框中,:object =&gt; "#nowlistening song"</p><p> 尽管如此,当我加载我的网页时,我还是看到了以下内容:</p><pre> object 1 = "#nowreading book" object 2 = "#nowreading book" object 3 = "#nowreading book"</pre><p> 这对 box#1 来说是有意义的。 但以下内容对 box#2 没有意义:</p><pre> object 1 = "#nowlistening song" object 2 = "#nowreading book" *** this is wrong object 3 = "#nowlistening song"</pre><p> 有人可以向我解释为什么将“#{object.content}”放在facebox DIV 中会导致内容发生变化吗? 我觉得这种行为很奇怪。 非常感谢您的帮助!</p><p> - - 编辑 - -</p><p> 在 users/show.html.erb 中:</p><pre> &lt;%= render:partial =&gt; 'nowposts/nowpost', :locals =&gt; {:object =&gt; @nowreading, :object_link =&gt; @reading_link, :object_mode =&gt; "reading", :doing_img =&gt; @reading_img, :doing_url =&gt; @reading_url_text } %&gt; &lt;%= render:partial =&gt; 'nowposts/nowpost', :locals =&gt; {:object =&gt; @nowlistening, :object_link =&gt; @listening_link, :object_mode =&gt; "listening", :doing_img =&gt; @listening_img, :doing_url =&gt; @listening_url_text } %&gt;</pre><p> 在 nowposts/_nowpost.html.erb 中:</p><pre> &lt;div class ="status bl br"&gt; Fresh on &lt;%= object.updated_at.strftime("%b %d, %Y") %&gt;&lt;br \&gt; &lt;% if user_signed_in? %&gt; &lt;%= "object 1 = #{object.content}" %&gt; &lt;div id="float_have" style="display:none;"&gt; &lt;%= "object 2 = #{object.content}" %&gt; &lt;%= render:partial =&gt; 'nowposts/floatpost', :locals =&gt; {:object =&gt; object.content } %&gt; &lt;/div&gt; &lt;div id="float_wanna" style="display:none;"&gt; &lt;%= "object 3 = #{object.content}" %&gt; &lt;%= render:partial =&gt; 'wishlists/floatpost', :locals =&gt; {:object =&gt; object.content } %&gt; &lt;/div&gt; &lt;a href="#float_have" rel="facebox"&gt;Have!&lt;/a&gt; | &lt;a href="#float_wanna" rel="facebox"&gt;Wanna!&lt;/a&gt; &lt;% end %&gt; &lt;/div&gt;</pre><p> 在 application.html.erb 中:</p><pre> &lt;script type="text/javascript"&gt; jQuery(document).ready(function($) { $('a[rel*=facebox]').facebox({ loadingImage: '../images/loading.gif', closeImage: '../images/closelabel.png' }) }) &lt;/script&gt;</pre><p> 部分 nowposts/_floatpoast.html.erb</p><pre> &lt;h2&gt;Wanna?&lt;/h2&gt; &lt;h3&gt;You wanna do this, Great. put it on your bucket list: &lt;/h3&gt; &lt;%= form_for(,wishlist: ,as =&gt; @wishlist: :url =&gt; {,controller =&gt; "wishlists": ,action =&gt; "create": .user_id =&gt; current_user } ) do |f| %&gt; &lt;p&gt;&lt;%= f:label.content %&gt;&lt;br /&gt; &lt;%= f:text_field,content: ,value =&gt; object: .size =&gt; "80" %&gt;&lt;/p&gt; &lt;p&gt;&lt;%= f.submit "Post!" %&gt;&lt;/p&gt; &lt;% end %&gt;</pre><p> 正如我在下面的评论中提到的,在我实现 API 结果和这些嵌套路由的缓存之前,这段代码在我的最后一次提交(几天前)中工作:</p><pre> resources:users resources:nowposts, :only =&gt; [:have_create, :create, :new, :show] end</pre><p> 但我不认为这是问题所在。 我刚刚进行了另一个测试,并且 object.content 仅在我将其包含在此 div 中时才会更改:</p><pre> &lt;div id="float_have" style="display:none;"&gt;</pre><p> 我尝试了另一个随机 div:</p><pre> &lt;div id="status"&gt; &lt;%= "object 2 = #{object.content}" %&gt; &lt;/div&gt;</pre><p> 这显示正确。 这让我觉得问题出在 Facebox 脚本上? 但如果是这样,我想知道为什么它在几天前起作用了。</p><p> 需要帮助请叫我。</p></div> - variable / dynamic content is changing based on <div> — why? 使用thickbox根据输入显示字段数 - Using thickbox to display number of fields based on input
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM