为什么我必须双击才能渲染组件?
单击视图图标后,我想显示一个组件。不知何故,我必须双击以显示组件。每当我单击视图图标时,都会将ISViewing
设置为true,并且< viewTicket/>
组件在表容器下方显示。我声明viewID
和setViewId
on app.js
并设置usecontext
文件,以便我可以在不同的组件。
import Table from '@mui/material/Table';
import TableBody from '@mui/material/TableBody';
import TableCell from '@mui/material/TableCell';
import TableContainer from '@mui/material/TableContainer';
import TableHead from '@mui/material/TableHead';
import TableRow from '@mui/material/TableRow';
import Paper from '@mui/material/Paper';
import RemoveRedEyeOutlinedIcon from '@mui/icons-material/RemoveRedEyeOutlined';
import ClearOutlinedIcon from '@mui/icons-material/ClearOutlined';
import { useState, useEffect, useContext } from 'react';
import { useNavigate } from 'react-router-dom';
import { collection, deleteDoc, doc, onSnapshot } from 'firebase/firestore';
import { db } from '../../firebase';
import { Link } from 'react-router-dom';
import ViewTicket from '../viewTicket/ViewTicket';
import { UserContext } from '../../Contexts/UserContext';
const Tables = () => {
const { viewId, setViewId } = useContext(UserContext)
const [data, setData] = useState([]);
const [isViewing, setIsViewing] = useState(false);
useEffect(() => {
const unsub = onSnapshot(collection(db, "invoices"), (snapshot) => {
let list = [];
snapshot.docs.forEach((doc) => {
list.push({ id: doc.id, ...doc.data() });
})
setData(list)
}, (err) => {
console.log(err)
});
return () => {
unsub();
}
}, [])
return (
<div className="conatainer">
<TableContainer component={Paper} className="table">
<Table sx={{ minWidth: 650 }} aria-label="simple table">
<TableHead>
<TableRow>
<TableCell className="tableCell">Subject</TableCell>
<TableCell className="tableCell">Fullname</TableCell>
<TableCell className="tableCell">Email</TableCell>
<TableCell className="tableCell">Action</TableCell>
</TableRow>
</TableHead>
<TableBody>
{data.map((item) => (
<TableRow key={item.id}>
<TableCell className="tableCell">{item.subject}</TableCell>
<TableCell className="tableCell">{item.fullname}</TableCell>
<TableCell className="tableCell">{item.email}</TableCell>
<TableCell className="tableCell">
<RemoveRedEyeOutlinedIcon onClick={() => {
setViewId(item.id)
setIsViewing(true);
}} className="viewButton" />
<ClearOutlinedIcon className="deleteButton" onClick={() => deleteData(item.id)} />
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
<div>
{!isViewing ? null :
<ViewTicket/>
}
</div>
</div>
)
}
export default Tables
这就是我对&lt; viewTicket/&gt;
组件所拥有的。它需要ViewID
才能从Firebase获取文档详细信息。然后显示主题和电子邮件。
import { useState, useEffect, useContext } from 'react';
import { doc, getDoc } from 'firebase/firestore';
import { db } from '../../firebase';
import { UserContext } from '../../Contexts/UserContext';
const ViewTicket = () => {
const { viewId, setViewId } = useContext(UserContext)
const [tempData, setTempData] = useState("");
useEffect(() => {
if (viewId) {
const getUserData = async () => {
const dataRef = doc(db, "invoices", viewId);
const docSnap = await getDoc(dataRef);
if (docSnap.exists()) {
setTempData(docSnap.data());
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
}
viewId && getUserData();
} else {
console.log('id does not exist')
}
}, [])
return (
<div className="single">
<div className="singleContainer">
<div className="details">
<h1>{tempData.subject}</h1>
<p>{tempData.email}</p>
</div>
</div>
</div>
)
}
export default ViewTicket
数据集的示例就是这样:
const userData = [
{
id: "dklk30919",
fullname: "Joe Roberts",
email: "[email protected]",
subject: "button doesn't work"
},
{
id: "mddsakjk32",
fullname: "Kevin Durant",
email: "[email protected]",
subject: "error while fetching data"
}
]
这是我的firebase.js
文件的样子。出于安全目的,我删除了所有详细信息。
// Import the functions you need from the SDKs you need
import {
initializeApp
} from "firebase/app";
import {
getAuth
} from "firebase/auth";
import { getFirestore } from "firebase/firestore";
import { getStorage } from "firebase/storage";
// Your web app's Firebase configuration
const firebaseConfig = {
apiKey: "",
authDomain: "",
projectId: "",
storageBucket: "",
messagingSenderId: "",
appId: ""
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
export const db = getFirestore(app);
export const auth = getAuth();
export const storage = getStorage(app);
I want to display a component once I click the view icon. Somehow, I have to double click to display the component. Whenever I click the view icon it sets the isViewing
to be true and the <ViewTicket/>
component gets displayed under the Table container. I declared viewId
and setViewId
on App.js
and set up useContext
file so that I can use the state in different components.
import Table from '@mui/material/Table';
import TableBody from '@mui/material/TableBody';
import TableCell from '@mui/material/TableCell';
import TableContainer from '@mui/material/TableContainer';
import TableHead from '@mui/material/TableHead';
import TableRow from '@mui/material/TableRow';
import Paper from '@mui/material/Paper';
import RemoveRedEyeOutlinedIcon from '@mui/icons-material/RemoveRedEyeOutlined';
import ClearOutlinedIcon from '@mui/icons-material/ClearOutlined';
import { useState, useEffect, useContext } from 'react';
import { useNavigate } from 'react-router-dom';
import { collection, deleteDoc, doc, onSnapshot } from 'firebase/firestore';
import { db } from '../../firebase';
import { Link } from 'react-router-dom';
import ViewTicket from '../viewTicket/ViewTicket';
import { UserContext } from '../../Contexts/UserContext';
const Tables = () => {
const { viewId, setViewId } = useContext(UserContext)
const [data, setData] = useState([]);
const [isViewing, setIsViewing] = useState(false);
useEffect(() => {
const unsub = onSnapshot(collection(db, "invoices"), (snapshot) => {
let list = [];
snapshot.docs.forEach((doc) => {
list.push({ id: doc.id, ...doc.data() });
})
setData(list)
}, (err) => {
console.log(err)
});
return () => {
unsub();
}
}, [])
return (
<div className="conatainer">
<TableContainer component={Paper} className="table">
<Table sx={{ minWidth: 650 }} aria-label="simple table">
<TableHead>
<TableRow>
<TableCell className="tableCell">Subject</TableCell>
<TableCell className="tableCell">Fullname</TableCell>
<TableCell className="tableCell">Email</TableCell>
<TableCell className="tableCell">Action</TableCell>
</TableRow>
</TableHead>
<TableBody>
{data.map((item) => (
<TableRow key={item.id}>
<TableCell className="tableCell">{item.subject}</TableCell>
<TableCell className="tableCell">{item.fullname}</TableCell>
<TableCell className="tableCell">{item.email}</TableCell>
<TableCell className="tableCell">
<RemoveRedEyeOutlinedIcon onClick={() => {
setViewId(item.id)
setIsViewing(true);
}} className="viewButton" />
<ClearOutlinedIcon className="deleteButton" onClick={() => deleteData(item.id)} />
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
<div>
{!isViewing ? null :
<ViewTicket/>
}
</div>
</div>
)
}
export default Tables
This is what I have for the <ViewTicket/>
component. It takes the viewId
to get the document details from the Firebase. Then it displays the subject and email.
import { useState, useEffect, useContext } from 'react';
import { doc, getDoc } from 'firebase/firestore';
import { db } from '../../firebase';
import { UserContext } from '../../Contexts/UserContext';
const ViewTicket = () => {
const { viewId, setViewId } = useContext(UserContext)
const [tempData, setTempData] = useState("");
useEffect(() => {
if (viewId) {
const getUserData = async () => {
const dataRef = doc(db, "invoices", viewId);
const docSnap = await getDoc(dataRef);
if (docSnap.exists()) {
setTempData(docSnap.data());
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
}
viewId && getUserData();
} else {
console.log('id does not exist')
}
}, [])
return (
<div className="single">
<div className="singleContainer">
<div className="details">
<h1>{tempData.subject}</h1>
<p>{tempData.email}</p>
</div>
</div>
</div>
)
}
export default ViewTicket
Examples of dataset would be like this:
const userData = [
{
id: "dklk30919",
fullname: "Joe Roberts",
email: "[email protected]",
subject: "button doesn't work"
},
{
id: "mddsakjk32",
fullname: "Kevin Durant",
email: "[email protected]",
subject: "error while fetching data"
}
]
This is what my Firebase.js
file looks like. I have removed all the details for security purpose.
// Import the functions you need from the SDKs you need
import {
initializeApp
} from "firebase/app";
import {
getAuth
} from "firebase/auth";
import { getFirestore } from "firebase/firestore";
import { getStorage } from "firebase/storage";
// Your web app's Firebase configuration
const firebaseConfig = {
apiKey: "",
authDomain: "",
projectId: "",
storageBucket: "",
messagingSenderId: "",
appId: ""
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
export const db = getFirestore(app);
export const auth = getAuth();
export const storage = getStorage(app);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论