【发布时间】:2021-03-30 07:14:09
【问题描述】:
我是 React 开发的新手。我目前想要实现的功能是允许用户发送上传的图片。该功能类似于信使上传图片,可以与文字一起发送。 以下是我当前的代码:
import React, { useState } from 'react'
import "./ChatInput.css"
import { useStateValue } from './StateProvider';
import db from './firebase';
import firebase from 'firebase';
import { storage } from './firebase';
function ChatInput({channelName, channelId}) {
const [input, setInput] = useState("");
const [{user}] = useStateValue();
const [image, setImage] = useState(null);
const [imageUrl, setImageUrl] = useState("");
const sendMessage = (e) => {
e.preventDefault();
if(channelId){
db.collection('courses').doc(channelId).collection('messages').add({
message:input,
timestamp:firebase.firestore.FieldValue.serverTimestamp(),
user:user.displayName,
userImage: user.photoURL,
});
}
setInput("");
};
const fileSelectedHandler = e => {
if (e.target.files[0]) {
setImage(e.target.files[0]);
}
};
const fileUploadedHandler = () => {
const uploadTask = storage.ref(`images/${image.name}`).put(image);
uploadTask.on(
"state_changed",
snapshot => {},
error => {
console.log(error);
},
() => {
storage
.ref("images")
.child(image.name)
.getDownloadURL()
.then(url => {
setImageUrl(url)
});
}
);
}
return (
<div className ="chatInput">
<form>
<input
value ={input}
onChange={(e)=>setInput(e.target.value)}
placeholder={`Message #${channelName?.toLowerCase()}`} />
<button type="submit" onClick={sendMessage}>SEND</button>
</form>
<input type="file" onChange={fileSelectedHandler}/>
<button type="submit" onClick={fileUploadedHandler}>UPLOAD</button>
<br />
<img src={imageUrl} alt="" />
</div>
);
}
export default ChatInput;
因为图片存储在firebase-storage中,而用户发送的消息存储在firestore中。我不知道如何连接他们两个。希望有人能对代码提供答案和建议会更好。
【问题讨论】:
-
您正在使用
imageUrl正确地将文档添加到firestore,因此现在映射集合并相应地显示消息。如果你不知道怎么做,那就问我,我会放代码 -
@GayatriDipali,你介意把代码放在这里吗?非常感谢。
标签: reactjs firebase google-cloud-firestore firebase-storage