Javascript 在React中切换单个元素
我有一个问题。我在react中创建了联系人表单,我只想折叠单击的单个联系人。Toggle是应该折叠它的方法。科拉普塞是一个国家。我的问题是,当我单击它时,会影响所有接触,并且所有接触都被折叠。我怎样才能改进它 ContactBook.jsJavascript 在React中切换单个元素,javascript,reactjs,toggle,Javascript,Reactjs,Toggle,我有一个问题。我在react中创建了联系人表单,我只想折叠单击的单个联系人。Toggle是应该折叠它的方法。科拉普塞是一个国家。我的问题是,当我单击它时,会影响所有接触,并且所有接触都被折叠。我怎样才能改进它 ContactBook.js import React, { Component } from "react"; import Contact from "../Contact/Contact"; import "./ContactBook
import React, { Component } from "react";
import Contact from "../Contact/Contact";
import "./ContactBook.css";
class ContactBook extends Component{
constructor(props){
super(props);
this.state = {
colapse :true,
contacts: [
{
id: 1,
name: 'Propulsion Academy',
address: 'Zurich',
avatar: 'propulsion-academy-logo.png'
},
{
id: 2,
name: 'Propulsion Academy',
address: 'Luzern',
avatar: 'propulsion-academy-logo.png'
},
{
id: 3,
name: 'Propulsion Academy',
address: 'Munich',
avatar: 'propulsion-academy-logo.png'
},
],
};
}
toggle=()=>{
const doesShow = this.state.colapse;
this.setState({colapse: !doesShow});
}
deleteContact=(contactIndex)=>{
//with slice method we create copy of an array
const contacts =this.state.contacts.slice();
contacts.splice(contactIndex, 1);
this.setState({contacts: contacts})
}
//get name from input
addName = e =>{
this.setState({
name: e.target.value,
})
}
//get address from input
addAddress = e =>{
this.setState({
address: e.target.value,
})
}
//update state on button click
handleSubmit = (e) =>{
e.preventDefault()
if(this.state.name && this.state.address) {
this.setState(state =>{
const newContact = {
id: Math.max(...state.contacts.map(c => c.id))+1,
name: this.state.name,
address: this.state.address,
}
return{
contacts:[...state.contacts, newContact]
}
})
}
}
render() {
return (
<div className="contactBook">
<form className ="addContact" >
<p>New Contact</p>
<label id="name"><p>Name</p><input type='text' id="name" onChange={this.addName}/></label>
<label id="address"><p>Address:</p><input type='text' id="address" onChange={this.addAddress} /></label>
<input type='file' name='file' />
<button type='submit' onClick= {this.handleSubmit}>SUBMIT</button>
</form>
<div className="contacts">
{this.state.contacts.map((contact, index) =>
< Contact key={contact.id} contact={contact} delete={()=>this.deleteContact(index)} colapse={this.state.colapse} toggle={this.toggle}/>)
}
</div>
</div>
);
}
};
export default ContactBook;
import React, { Component } from "react";
import Contact from "./Contact";
// import "./ContactBook.css";
class ContactBook extends Component {
constructor(props) {
super(props);
this.state = {
contacts: [
{
id: 1,
name: "Propulsion Academy",
address: "Zurich",
avatar: "propulsion-academy-logo.png",
colapse: true
},
{
id: 2,
name: "Propulsion Academy",
address: "Luzern",
avatar: "propulsion-academy-logo.png",
colapse: true
},
{
id: 3,
name: "Propulsion Academy",
address: "Munich",
avatar: "propulsion-academy-logo.png",
colapse: true
}
]
};
}
// toggle = () => {
// const doesShow = this.state.colapse;
// this.setState({ colapse: !doesShow });
// };
deleteContact = contactIndex => {
//with slice method we create copy of an array
const contacts = this.state.contacts.slice();
contacts.splice(contactIndex, 1);
this.setState({ contacts: contacts });
};
togglecontact = contactIndex => {
let contacts = this.state.contacts.slice();
contacts[contactIndex].colapse = !contacts[contactIndex].colapse;
this.setState({ contacts: contacts });
};
//get name from input
addName = e => {
this.setState({
name: e.target.value
});
};
//get address from input
addAddress = e => {
this.setState({
address: e.target.value
});
};
//update state on button click
handleSubmit = e => {
e.preventDefault();
if (this.state.name && this.state.address) {
this.setState(state => {
const newContact = {
id: Math.max(...state.contacts.map(c => c.id)) + 1,
name: this.state.name,
address: this.state.address
};
return {
contacts: [...state.contacts, newContact]
};
});
}
};
render() {
return (
<div className="contactBook">
<form className="addContact">
<p>New Contact</p>
<label id="name">
<p>Name</p>
<input type="text" id="name" onChange={this.addName} />
</label>
<label id="address">
<p>Address:</p>
<input type="text" id="address" onChange={this.addAddress} />
</label>
<input type="file" name="file" />
<button type="submit" onClick={this.handleSubmit}>
SUBMIT
</button>
</form>
<div className="contacts">
{this.state.contacts.map((contact, index) => (
<Contact
key={contact.id}
contact={contact}
togglecontact={() => this.togglecontact(index)}
delete={() => this.deleteContact(index)}
colapse={this.state.colapse}
toggle={this.toggle}
/>
))}
</div>
</div>
);
}
}
export default ContactBook;
import React,{Component}来自“React”;
从“./Contact/Contact”导入联系人;
导入“/ContactBook.css”;
类ContactBook扩展组件{
建造师(道具){
超级(道具);
this.state={
是的,
联系人:[
{
id:1,
名称:“推进学院”,
地址:苏黎世,
阿凡达:“推进学院徽标.png”
},
{
id:2,
名称:“推进学院”,
地址:'Luzern',
阿凡达:“推进学院徽标.png”
},
{
id:3,
名称:“推进学院”,
地址:慕尼黑,
阿凡达:“推进学院徽标.png”
},
],
};
}
切换=()=>{
const doesShow=this.state.colapse;
this.setState({colapse:!doesShow});
}
deleteContact=(contactIndex)=>{
//使用slice方法创建数组的副本
const contacts=this.state.contacts.slice();
触点。拼接(触点索引,1);
this.setState({contacts:contacts})
}
//从输入中获取名称
addName=e=>{
这个.setState({
名称:e.target.value,
})
}
//从输入获取地址
addAddress=e=>{
这个.setState({
地址:e.target.value,
})
}
//单击按钮时更新状态
handleSubmit=(e)=>{
e、 预防默认值()
if(this.state.name&&this.state.address){
this.setState(state=>{
常数newContact={
id:Math.max(…state.contacts.map(c=>c.id))+1,
名称:this.state.name,
地址:this.state.address,
}
返回{
联系人:[…state.contacts,newContact]
}
})
}
}
render(){
返回(
新联系人
姓名
地址:
提交
{this.state.contacts.map((联系人,索引)=>
this.deleteContact(index)}colapse={this.state.colapse}toggle={this.toggle}/>)
}
);
}
};
导出默认通讯录;
Contact.js
import React from "react";
import "./Contact.css";
import avatar from '../assets/user.png'
const Contact = (props) =>{
return (
<div className = "col" >
<img src={avatar} alt="avatar" onClick={props.toggle}/>
{props.colapse === true ?
<div>
<p>Name: {props.contact.name}</p>
<p>Address: {props.contact.address}</p>
<button onClick={props.delete}> Delete </button>
</div> : null
}
</div>
)
};
export default Contact;
从“React”导入React;
导入“/Contact.css”;
从“../assets/user.png”导入化身
常量联系人=(道具)=>{
返回(
{props.colapse==true?
名称:{props.contact.Name}
地址:{props.contact.Address}
删除
:null
}
)
};
导出默认联系人;
所有联系人都有一个函数,由于使用了.map(),它们的行为都相同,因为切换其中一个会切换用于呈现所有单个联系人的状态。解决方案是在您的状态下传递所选联系人,以便您的应用程序实际知道要呈现哪个联系人!希望这是有道理的
祝你好运,让我们知道事情是如何发展的 所有联系人都有一个函数,由于使用.map(),它们的行为都相同,因为切换一个会切换用于呈现所有单个联系人的状态。解决方案是在您的状态下传递所选联系人,以便您的应用程序实际知道要呈现哪个联系人!希望这是有道理的
祝你好运,让我们知道事情是如何发展的 我建议您将折叠和他的方法移动到接触组件,如下所示:
const Contact = (props) =>{
[collapse,setCollapse] = useState(true)
return (
<div className = "col" >
<img src={avatar} alt="avatar" onClick{()=>setCollape(prev=>!prev)}/>
{collapse === true ?
<div>
<p>Name: {props.contact.name}</p>
<p>Address: {props.contact.address}</p>
<button onClick={props.delete}> Delete </button>
</div> : null
}
</div>
)
};
const Contact=(道具)=>{
[collapse,setCollapse]=useState(true)
返回(
setCollape(prev=>!prev)}/>
{collapse===true?
名称:{props.contact.Name}
地址:{props.contact.Address}
删除
:null
}
)
};
在这个组件中,我创建了一个状态来管理贴图中渲染的每个组件的折叠。
此外,prev会提供您提交的最后一个值,最好使用prev,而不仅仅是
setCollapse(!collapse)
我建议您将collapse及其方法移动到Contact组件,如下所示:
const Contact = (props) =>{
[collapse,setCollapse] = useState(true)
return (
<div className = "col" >
<img src={avatar} alt="avatar" onClick{()=>setCollape(prev=>!prev)}/>
{collapse === true ?
<div>
<p>Name: {props.contact.name}</p>
<p>Address: {props.contact.address}</p>
<button onClick={props.delete}> Delete </button>
</div> : null
}
</div>
)
};
const Contact=(道具)=>{
[collapse,setCollapse]=useState(true)
返回(
setCollape(prev=>!prev)}/>
{collapse===true?
名称:{props.contact.Name}
地址:{props.contact.Address}
删除
:null
}
)
};
在这个组件中,我创建了一个状态来管理贴图中渲染的每个组件的折叠。
此外,prev会给出您提交的最后一个值,最好使用prev,而不仅仅是setCollapse(!collapse)
就是这样:
ContactBook.js
import React, { Component } from "react";
import Contact from "../Contact/Contact";
import "./ContactBook.css";
class ContactBook extends Component{
constructor(props){
super(props);
this.state = {
colapse :true,
contacts: [
{
id: 1,
name: 'Propulsion Academy',
address: 'Zurich',
avatar: 'propulsion-academy-logo.png'
},
{
id: 2,
name: 'Propulsion Academy',
address: 'Luzern',
avatar: 'propulsion-academy-logo.png'
},
{
id: 3,
name: 'Propulsion Academy',
address: 'Munich',
avatar: 'propulsion-academy-logo.png'
},
],
};
}
toggle=()=>{
const doesShow = this.state.colapse;
this.setState({colapse: !doesShow});
}
deleteContact=(contactIndex)=>{
//with slice method we create copy of an array
const contacts =this.state.contacts.slice();
contacts.splice(contactIndex, 1);
this.setState({contacts: contacts})
}
//get name from input
addName = e =>{
this.setState({
name: e.target.value,
})
}
//get address from input
addAddress = e =>{
this.setState({
address: e.target.value,
})
}
//update state on button click
handleSubmit = (e) =>{
e.preventDefault()
if(this.state.name && this.state.address) {
this.setState(state =>{
const newContact = {
id: Math.max(...state.contacts.map(c => c.id))+1,
name: this.state.name,
address: this.state.address,
}
return{
contacts:[...state.contacts, newContact]
}
})
}
}
render() {
return (
<div className="contactBook">
<form className ="addContact" >
<p>New Contact</p>
<label id="name"><p>Name</p><input type='text' id="name" onChange={this.addName}/></label>
<label id="address"><p>Address:</p><input type='text' id="address" onChange={this.addAddress} /></label>
<input type='file' name='file' />
<button type='submit' onClick= {this.handleSubmit}>SUBMIT</button>
</form>
<div className="contacts">
{this.state.contacts.map((contact, index) =>
< Contact key={contact.id} contact={contact} delete={()=>this.deleteContact(index)} colapse={this.state.colapse} toggle={this.toggle}/>)
}
</div>
</div>
);
}
};
export default ContactBook;
import React, { Component } from "react";
import Contact from "./Contact";
// import "./ContactBook.css";
class ContactBook extends Component {
constructor(props) {
super(props);
this.state = {
contacts: [
{
id: 1,
name: "Propulsion Academy",
address: "Zurich",
avatar: "propulsion-academy-logo.png",
colapse: true
},
{
id: 2,
name: "Propulsion Academy",
address: "Luzern",
avatar: "propulsion-academy-logo.png",
colapse: true
},
{
id: 3,
name: "Propulsion Academy",
address: "Munich",
avatar: "propulsion-academy-logo.png",
colapse: true
}
]
};
}
// toggle = () => {
// const doesShow = this.state.colapse;
// this.setState({ colapse: !doesShow });
// };
deleteContact = contactIndex => {
//with slice method we create copy of an array
const contacts = this.state.contacts.slice();
contacts.splice(contactIndex, 1);
this.setState({ contacts: contacts });
};
togglecontact = contactIndex => {
let contacts = this.state.contacts.slice();
contacts[contactIndex].colapse = !contacts[contactIndex].colapse;
this.setState({ contacts: contacts });
};
//get name from input
addName = e => {
this.setState({
name: e.target.value
});
};
//get address from input
addAddress = e => {
this.setState({
address: e.target.value
});
};
//update state on button click
handleSubmit = e => {
e.preventDefault();
if (this.state.name && this.state.address) {
this.setState(state => {
const newContact = {
id: Math.max(...state.contacts.map(c => c.id)) + 1,
name: this.state.name,
address: this.state.address
};
return {
contacts: [...state.contacts, newContact]
};
});
}
};
render() {
return (
<div className="contactBook">
<form className="addContact">
<p>New Contact</p>
<label id="name">
<p>Name</p>
<input type="text" id="name" onChange={this.addName} />
</label>
<label id="address">
<p>Address:</p>
<input type="text" id="address" onChange={this.addAddress} />
</label>
<input type="file" name="file" />
<button type="submit" onClick={this.handleSubmit}>
SUBMIT
</button>
</form>
<div className="contacts">
{this.state.contacts.map((contact, index) => (
<Contact
key={contact.id}
contact={contact}
togglecontact={() => this.togglecontact(index)}
delete={() => this.deleteContact(index)}
colapse={this.state.colapse}
toggle={this.toggle}
/>
))}
</div>
</div>
);
}
}
export default ContactBook;
import React,{Component}来自“React”;
从“/Contact”导入联系人;
//导入“/ContactBook.css”;