使用React和Javascript保存动态创建的数据的最佳方法是什么? [英] What is the best way to save my dynamicly created data using React and Javascript?
问题描述
我一直试图让我的动态表单起作用,但我想知道保存这样生成的数据的最佳做法是什么。
I have been trying to get my dynamic form to work but I was wondering what the best practice is to save data generated like this.
我的解决方案有效,但我觉得有更好的方法。
My solution works but I have the feeling there is a better way of doing it.
目前我将输出字段的两个值保存在一个单独的数组中。但实际上它们属于一体,所以我有一个链接值和一个我需要保存的内容值。
At the moment I am saving both of the values of the input fields in a seperate array. But actually they belong together, so I have a link value and a content value that I need to save.
稍后我需要映射这些值以创建具有存储值的新元素。
Later I need to map over these values to create new elements with the stored value.
我现在遇到的问题是我不知道如何同时映射两个数组。我也想知道用一个对象来创建一个具有所有这些值的对象然后只是映射它是不是更好。
The problem I have now is that I don't know how to map over two arrays at the same time. I am also wondering if it's not better to just create one Object with all of these values instead and then just map over that.
希望有人可以帮助我。
这是我的代码:
class MediaInput extends React.Component {
render() {
const linkName = `link${this.props.index}`;
const contentName = `content${this.props.index}`;
return (
<div>
<ControlLabel>Media (optional)</ControlLabel>
<input
onChange={(event) => this.props.handleChangeUrl(event, this.props.index)}
name={ linkName }
value={ this.props.mediaUrls[this.props.index]}
className="form-control"
placeholder="Add your media url. We accept YouTube, Vimeo and SoundCloud links"
type="text"
/>
<input
name={ contentName }
onChange={(event) => this.props.handleChangeContent(event, this.props.index)}
value={ this.props.mediaContents[this.props.index]}
className="form-control"
placeholder="Add your media content"
type="text"
/>
</div>
);
}
}
export default class AddSparkShanghai extends Component {
constructor(props) {
super(props);
this.createSpark = this.createSpark.bind(this);
this.onChange = this.onChange.bind(this);
this.handleChangeUrl = this.handleChangeUrl.bind(this);
this.handleChangeContent = this.handleChangeContent.bind(this);
this.state ={
mediaFields: [],
content: [],
mediaUrls: [ null, null, null ],
mediaContents: [ {'', '', ''],
};
}
[...]
// Add/remove media fields
add() {
event.preventDefault();
const mediaFields = this.state.mediaFields.concat(MediaInput);
if (i < 3) {
this.setState({ mediaFields });
i++
} else {
Bert.alert('Only 3 media links are allowed', 'danger');
}
}
remove() {
event.preventDefault();
const lastElement = this.state.mediaFields.pop();
const mediaFields = this.state.mediaFields;
this.setState({ mediaFields });
i--
}
// Handle change media fields
handleChangeUrl(e, index) {
// Shallow copy of array
const mediaUrls = this.state.mediaUrls.slice();
let url = e.target.value
if (!/^https?:\/\//i.test(url)) {
url = 'http://' + url;
}
mediaUrls[index] = url;
this.setState({ mediaUrls});
}
handleChangeContent(e, index) {
// Shallow copy of array
const mediaContents = this.state.mediaContents.slice();
mediaContents[index] = e.target.value;
this.setState({ mediaContents });
}
[...]
const mediaFields = this.state.mediaFields.map((Element, index) => {
return <Element key={ index } index={ index } mediaUrls={this.state.mediaUrls} mediaContents={this.state.mediaContents} handleChangeUrl={this.handleChangeUrl} handleChangeContent={this.handleChangeContent} />
})
[...]
<div>
{ mediaFields }
<Button onClick={ () => this.add() }>Add media field</Button>
<Button onClick={ () => this.remove() }>Remove media field</Button>
</div>
推荐答案
未经测试的代码,但如果您更改以下内容它应该有效:
Untested code, but it should work if you change the following:
更改此:
this.state ={
mediaFields: [],
content: [],
mediaUrls: [ null, null, null ],
mediaContents: [ {'', '', ''],
};
收件人:
this.state ={
mediaFields: [],
content: [],
data: [],
};
并且更改:
handleChangeUrl(e, index) {
// Shallow copy of array
const mediaUrls = this.state.mediaUrls.slice();
let url = e.target.value
if (!/^https?:\/\//i.test(url)) {
url = 'http://' + url;
}
mediaUrls[index] = url;
this.setState({ mediaUrls});
}
收件人:
handleChangeUrl(e, index) {
// Shallow copy of array
const tempData = this.state.data.slice();
let url = e.target.value
if (!/^https?:\/\//i.test(url)) {
url = 'http://' + url;
}
tempData[index].link = url;
this.setState({ tempData });
}
并且更改:
handleChangeContent(e, index) {
// Shallow copy of array
const mediaContents = this.state.mediaContents.slice();
mediaContents[index] = e.target.value;
this.setState({ mediaContents });
}
收件人:
handleChangeContent(e, index) {
// Shallow copy of array
const tempData = this.state.data.slice();
tempData[index].content = e.target.value;
this.setState({ tempData });
}
最后:
add() {
event.preventDefault();
const mediaFields = this.state.mediaFields.concat(MediaInput);
if (i < 3) {
this.setState({ mediaFields });
i++
} else {
Bert.alert('Only 3 media links are allowed', 'danger');
}
}
remove() {
event.preventDefault();
const lastElement = this.state.mediaFields.pop();
const mediaFields = this.state.mediaFields;
this.setState({ mediaFields });
i--;
}
收件人:
add() {
event.preventDefault();
const mediaFields = this.state.mediaFields.concat(MediaInput);
const data = this.state.data.slice();
data.push({ link: "", content: "" });
if (i < 3) {
this.setState({ data, mediaFields });
i++
} else {
Bert.alert('Only 3 media links are allowed', 'danger');
}
}
remove() {
event.preventDefault();
const lastElement = this.state.mediaFields.pop();
const mediaFields = this.state.mediaFields;
const data = this.state.data.slice();
data.pop();
this.setState({ data, mediaFields });
i--;
}
注意:已经过编辑以修复最后一批修改!
NOTE: Has been edited to fix the last lot of changes!
这篇关于使用React和Javascript保存动态创建的数据的最佳方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!