使用表单中的值来渲染Firebase中的特定数据 [英] Use value from form to render specific data from firebase

查看:49
本文介绍了使用表单中的值来渲染Firebase中的特定数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在用户从表单中输入控件编号后,我正在尝试从Firebase Firestore数据库中呈现数据.

I'm trying to render data from my Firebase Firestore DB after a user enters a control number from a form.

这是SingleQuery钩子,也就是我的Firestore DB的侦听器

This is SingleQuery hook a.k.a. the listener to my Firestore DB

//Code to Query data from Database
function SingleQuery() {
  const [drivers, setDrivers] = useState([]);

  useEffect(() => {
    const unsubscribe = firebase
      .firestore()
      .collection("drivers")
      .where("controlNumber", "==", {{CONTROL NUMBER FROM FORM}}) //get data according to control number
      .onSnapshot(snapshot => {
        const newDriver = snapshot.docs.map(doc => {
          return {
            // returns a new Object
            id: doc.id,
            ...doc.data()
          };
        });
        setDrivers(newDriver);
      });

    return () => unsubscribe();
  }, []);

  return drivers;
}

下面的代码生成用户在输入控制编号后可以看到的内容.搜索框位于< div className ="searchBar"> 下,结果将在< div className ="queryResults">

Code below generates what the user can see after entering the control number. the search box is under <div className="searchBar"> and the result will be generated under <div className="queryResults">

export const violationQuery = () => {
  const drivers = SingleQuery();

  return (
    <Styles>
      <div className="violationQuery">
        <br />
        <br />
        <br />
        <h4>Enter Control Number</h4>
        <div className="searchBar" class="input-group-sm">
          <form>
            <input
              type="text"
              className="form-control"
              aria-label="Small"
              aria-describedby="inputGroup-sizing-sm"
              placeholder="Control Number"
              id="controlNum"
            />
            <br />
            <input className="btn btn-primary" type="submit" value="Submit" />
          </form>
        </div>

        <div className="queryResults">
          <br />
          <h5>
            Showing results for <b>Insert Control Number</b>
          </h5>
          <br></br>
          <Container>
            <Row>
              <Col>
                <div id="results-list">
                  {drivers.map(driver => (
                    <ol key={driver.id}>
                      <li>
                        <b>Control Number</b>: {driver.controlNumber}
                      </li>
                      <li>
                        <b>Date and Time</b>: {driver.dateAndTime}
                      </li>
                      <li>
                        <b>Driver name</b>: {driver.name}
                      </li>
                      <li>
                        <b>License Number</b>: {driver.licenseNumber}
                      </li>
                      <li>
                        <b>Violations</b>: {driver.violations}
                      </li>
                      <li>
                        <b>Location</b>: {driver.latitude}, {driver.longitude}
                      </li>
                    </ol>
                  ))}
                </div>
              </Col>
              <Col>
                <MapView2 />
              </Col>
            </Row>
          </Container>
        </div>
      </div>
    </Styles>
  );
};

很抱歉,如果问题的表述有些混乱,希望能提供一些答案.谢谢!

I'm sorry if the presentation of the question a bit messed up, hoping for some answers. Thanks!

推荐答案

,您需要将 controlNumber 保存为状态并将其传递给SingleQuery挂钩.在SingleQuery挂钩中添加一个检查,以使 controlNumber 不应为空或在进行API调用之前为null.还要在useEffect的依赖项数组中添加 controlNumber .

you need to save controlNumber in state and pass it the SingleQuery hook. Add a check inside SingleQuery hook such that controlNumber should not be empty or null beore making an API call. And also add controlNumber in dependency array of useEffect.

export const violationQuery = () => {
  const [inputControlNumber, setInputControlNumber] = useState("");
  const [controlNumber, setControlNumber] = useState("");

  const drivers = SingleQuery(controlNumber);

  function onSubmit(e) {
     setControlNumber(inputControlNumber);
       e.preventDefault();
  };

  return (
    <Styles>
      <div className="violationQuery">
        <br />
        <br />
        <br />
        <h4>Enter Control Number</h4>
        <div className="searchBar" class="input-group-sm">// class attr won't work. Add it to className.
          <form onSubmit={onSubmit}>
            <input
              type="text"
              className="form-control"
              aria-label="Small" 
              aria-describedby="inputGroup-sizing-sm"
              placeholder="Control Number"
              id="controlNum"   // do not use Id unless you have some special case to handle.
              value={inputControlNumber}
              onChange={(event) => setInputControlNumber(event.target.value);}
            />
            <br />
            <input className="btn btn-primary" type="submit" value="Submit" />
          </form>
        </div>

        <div className="queryResults">
          <br />
          <h5>
            Showing results for <b>Insert Control Number</b>
          </h5>
          <br></br>
          <Container>
            <Row>
              <Col>
                <div id="results-list">
                  {drivers.map(driver => (
                    <ol key={driver.id}>
                      <li>
                        <b>Control Number</b>: {driver.controlNumber}
                      </li>
                      <li>
                        <b>Date and Time</b>: {driver.dateAndTime}
                      </li>
                      <li>
                        <b>Driver name</b>: {driver.name}
                      </li>
                      <li>
                        <b>License Number</b>: {driver.licenseNumber}
                      </li>
                      <li>
                        <b>Violations</b>: {driver.violations}
                      </li>
                      <li>
                        <b>Location</b>: {driver.latitude}, {driver.longitude}
                      </li>
                    </ol>
                  ))}
                </div>
              </Col>
              <Col>
                <MapView2 />
              </Col>
            </Row>
          </Container>
        </div>
      </div>
    </Styles>
  );
};

function SingleQuery(controlNumber) {
  const [drivers, setDrivers] = useState([]);

  useEffect(() => {
    const unsubscribe = firebase
      .firestore()
      .collection("drivers")
      .where("controlNumber", "==", controlNumber) //get data according to control number
      .onSnapshot(snapshot => {
        const newDriver = snapshot.docs.map(doc => {
          return {
            // returns a new Object
            id: doc.id,
            ...doc.data()
          };
        });
        setDrivers(newDriver);
      });

    return () => unsubscribe();
  }, [controlNumber]);

  return drivers;
}

这篇关于使用表单中的值来渲染Firebase中的特定数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆