【问题标题】:Why can I console.log a variable but it not be able to use in a filter为什么我可以 console.log 一个变量,但它不能在过滤器中使用
【发布时间】:2021-10-02 19:36:44
【问题描述】:

我正在尝试创建一个React.js 博客,所以我有一个easybase.io 数据库来保存我的博客的数据。有一个显示所有帖子的页面,当有人点击帖子时,使用 react-router-dom 包中的 paramas 模块发送帖子 ID。在执行console.log(postid) 时,它显示在控制台中,但是当它通过过滤器时,由于某种原因它不起作用,有什么解释吗?过滤器正在过滤从数据库中选择的所有帖子,并且只返回具有相同 id 的对象。当输入task.id === 1 时,它会返回ID 为1 的对象,但是当在控制台中输入task.id === postidpostid 等于1 时,它什么也不返回。

所有帖子代码

/* eslint-disable */

import { useEasybase } from "easybase-react";

import React, { useEffect, useState } from "react";
import { useHistory } from "react-router-dom";

export default function BlogPosts() {
  let history = useHistory();
  const { db } = useEasybase();

  const [responseData, setResponse] = useState([]);

  async function getPosts() {
    const ebData = await db("POSTS").return().all();
    setResponse(ebData);
  }

  useEffect(() => {
    getPosts();
  }, []);

  return (
    <>
      <div>
        {responseData.map((val, key) => {
          return (
            <div
              style={{ border: "1px solid black", margin: "1em 1em" }}
              key={key}
              onClick={() => {
                history.push(`/post/${val.id}`);
              }}
            >
              <h3>{val.title}</h3>
              <div dangerouslySetInnerHTML={{ __html: val.post_text }} />
            </div>
          );
        })}
      </div>
    </>
  );
}

打开邮政编码

/* eslint-disable */
import React, { useEffect, useState } from "react";
import { useParams } from "react-router-dom";
import { useEasybase } from "easybase-react";

export default function BlogPosts() {
//testing for the filter function  
const tasks = [
    {
      taskId: 1,
      taskName: "Clean the bathroom",
      taskStatus: "Complete",
    },
    {
      taskId: 2,
      taskName: "Learn filtering data in React",
      taskStatus: "To do",
    },
    {
      taskId: 3,
      taskName: "Fix the bug on React project",
      taskStatus: "To do",
    },
    {
      taskId: 4,
      taskName: "Fix the car",
      taskStatus: "Complete",
    },
  ];

  const [responseData, setResponse] = useState([]);
  const [idState, setIdState] = useState(0);

  let { postid } = useParams();

  const { db } = useEasybase();

  async function getPosts() {
    const ebData = await db("POSTS").return().all();
    setResponse(ebData);
    console.log(ebData);
  }

  useEffect(() => {
    getPosts();
    setIdState(postid);
    console.log(postid);
  }, []);

  return (
    <>
      <div style={{ justifyContent: "center", alignContent: "center" }}>
        {tasks
          .filter((task) => task.taskStatus === "To do")
          .map((task) => (
            <li key={task.taskId}>{task.taskName}</li>
          ))}
        {responseData
          .filter((task) => task.id === postid)
          .map((task) => (
            <li key={task.id}>{task.title}</li>
          ))}
      </div>
    </>
  );
}

【问题讨论】:

  • 尝试 == 而不是 ===
  • @MiladRaeisi 除非你知道确切为什么要使用==,否则你永远不应该使用它。如果您的代码不适用于===,请修复导致相等检查的代码,不要通过让 JS 执行类型强制来“解决”它。
  • task.id === postid,应该是taskId === postid
  • @Mike'Pomax'Kamermans 我不是说在你的代码上放错误,我只是说试试看是否是问题,最好将字符串转换为整数,但首先找到问题。哦,看,你应该说 task.taskId 而不是 task.id
  • 这不是你说的,你使用了三个词和两个运算符:如果你推荐一个反模式,多说一点总是一个好主意 =)

标签: javascript arrays reactjs object filter


【解决方案1】:

最可能的原因是路由参数中的postid 是一个字符串(毕竟它来自的URL 是一个字符串),而您的task.id 是一个数字,如您的代码所示。

比较'1' === 1时,总是会因为类型不同而失败。要么使用==,或者更好,首先将路由参数(postid)转换为数字。

【讨论】:

  • 但实际上:永远不要使用==,正确验证你的值,这意味着在这种情况下使用parseInt,然后如果parseInt的结果是NaN,请确保使用快捷方式,因为它可能是。
  • 好的,非常感谢,我没想到它是作为字符串传递的,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2019-11-17
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
相关资源
最近更新 更多