• 11-01-2023, 11:14:05
    #1
    Merhaba,
    useState e default değer girince hata alıyorum, boş bırakınca problem yok çalışıyor ama default değer girmeliyim ki butona basmadan da sayfa yüklenince listeden bir tanesi gösterilsin boş kalmasın sayfa..
    Aşağıda görüldüğü üzere activeTabs değerine göre ul list döndürecek. Hangisine tıklandıysa o liste basılacak ekrana.

    7, 61 ve 73. satırlar

    import { useEffect, useState } from "react";
    import styled from "styled-components";
    import { useParams } from "react-router-dom";
    import React from "react";
    function Recipe() {
      const [details, setDetails] = useState([]);
      const [activeTabs, setActiveTabs] = useState("ingredients");
      const params = useParams();
      const getDetails = async () => {
        const options = {
          method: "GET",
          headers: {
            "X-RapidAPI-Key": process.env.REACT_APP_MEAL_RECIPE_API_KEY,
            "X-RapidAPI-Host": "food-recipe-api.p.rapidapi.com",
          },
        };
        setDetails([]);
        await fetch(
          `https://${process.env.REACT_APP_MEAL_RECIPE_API_HOST}/recipe/${params.id}`,
          options
        )
          .then((response) => response.json())
          .then((response) => {
            setDetails(response[0]);
            console.log(response[0]);
          });
      };
      useEffect(() => {
        getDetails();
      }, [params.id]);
      return (
        <DetailWrapper>
          <div>
            <div>
             
              <h2>{details.title}</h2>
            </div>
            <img src={details.img} alt={details.title} />
          </div>
          <Info>
            <div>
         
              <Button
                className={activeTabs === "instructions" ? "active" : ""}
                onClick={() => setActiveTabs("instructions")}
              >
                Instructions
              </Button>
            </div>
            <div>
    
              <Button
                className={activeTabs === "ingredients" ? "active" : ""}
                onClick={() => setActiveTabs("ingredients")}
              >
                Ingredients
              </Button>
            </div>
            <div>
              <ul>
                {activeTabs === "ingredients" &&
                  details.ingredients.map((ingredient) => (
                    <li>
                      {ingredient.amount +
                        " " +
                        ingredient.ingredientValue +
                        " " +
                        ingredient.ingredientKey}
                    </li>
                  ))}
              </ul>
              <ul>
                {activeTabs === "instructions" &&
                  details.descriptionSteps.map((steps) => (
                    <li key={steps.step}>{steps.description}</li>
                  ))}
              </ul>
            </div>
          </Info>
        </DetailWrapper>
      );
    }
    
    export default Recipe;
  • 11-01-2023, 11:21:58
    #2
    endmd adlı üyeden alıntı: mesajı görüntüle
    Merhaba,
    useState e default değer girince hata alıyorum, boş bırakınca problem yok çalışıyor ama default değer girmeliyim ki butona basmadan da sayfa yüklenince listeden bir tanesi gösterilsin boş kalmasın sayfa..
    Aşağıda görüldüğü üzere activeTabs değerine göre ul list döndürecek. Hangisine tıklandıysa o liste basılacak ekrana.

    7, 61 ve 73. satırlar

    import { useEffect, useState } from "react";
    import styled from "styled-components";
    import { useParams } from "react-router-dom";
    import React from "react";
    function Recipe() {
      const [details, setDetails] = useState([]);
      const [activeTabs, setActiveTabs] = useState("ingredients");
      const params = useParams();
      const getDetails = async () => {
        const options = {
          method: "GET",
          headers: {
            "X-RapidAPI-Key": process.env.REACT_APP_MEAL_RECIPE_API_KEY,
            "X-RapidAPI-Host": "food-recipe-api.p.rapidapi.com",
          },
        };
        setDetails([]);
        await fetch(
          `https://${process.env.REACT_APP_MEAL_RECIPE_API_HOST}/recipe/${params.id}`,
          options
        )
          .then((response) => response.json())
          .then((response) => {
            setDetails(response[0]);
            console.log(response[0]);
          });
      };
      useEffect(() => {
        getDetails();
      }, [params.id]);
      return (
        <DetailWrapper>
          <div>
            <div>
              {" "}
              <h2>{details.title}</h2>
            </div>
            <img src={details.img} alt={details.title} />
          </div>
          <Info>
            <div>
              {" "}
              <Button
                className={activeTabs === "instructions" ? "active" : ""}
                onClick={() => setActiveTabs("instructions")}
              >
                Instructions
              </Button>
            </div>
            <div>
              {" "}
              <Button
                className={activeTabs === "ingredients" ? "active" : ""}
                onClick={() => setActiveTabs("ingredients")}
              >
                Ingredients
              </Button>
            </div>
            <div>
              <ul>
                {activeTabs === "ingredients" &&
                  details.ingredients.map((ingredient) => (
                    <li>
                      {ingredient.amount +
                        " " +
                        ingredient.ingredientValue +
                        " " +
                        ingredient.ingredientKey}{" "}
                    </li>
                  ))}
              </ul>
              <ul>
                {activeTabs === "instructions" &&
                  details.descriptionSteps.map((steps) => (
                    <li key={steps.step}>{steps.description}</li>
                  ))}
              </ul>
            </div>
          </Info>
        </DetailWrapper>
      );
    }
    
    export default Recipe;
    Hata verilen state tam neresi bilmiyorum ama muhtemelen boş geldiği kısımda yazdığınız fonksiyonu çalıştırmıyordur. State adlarını kullanırken örneğin state içindeki alanı map ederken stateadi.map yerine satateadi?.map kullanırsanız, veri olduğu taktirde içeri girmesini sağlayacağı için içeri girmesini sağlar. Sanıyorum ki ingredient.amount diyorsunuz ama ilk aşamada boş olduğu için içerisine öyle bir obje gelmediği için crash oluyor onun yerine kullandığınız tüm yerleri ingredient?.amount gibi yazarsanız problem çözülecektir
  • 11-01-2023, 11:23:49
    #3
    Bir de boyle deneyin calisacak mi gorelim?

    import { useEffect, useState } from "react";
    import { useParams } from "react-router-dom";
    
    function Recipe() {
      const [details, setDetails] = useState({});
      const [activeTabs, setActiveTabs] = useState("ingredients");
      const params = useParams();
    
      const getDetails = async () => {
        const options = {
          method: "GET",
          headers: {
            "X-RapidAPI-Key": process.env.REACT_APP_MEAL_RECIPE_API_KEY,
            "X-RapidAPI-Host": "food-recipe-api.p.rapidapi.com",
          },
        };
        setDetails({});
        await fetch(
          `https://${process.env.REACT_APP_MEAL_RECIPE_API_HOST}/recipe/${params.id}`,
          options
        )
          .then((response) => response.json())
          .then((response) => {
            setDetails(response[0]);
            console.log(response[0]);
          });
      };
    
      useEffect(() => {
        getDetails();
      }, [params.id]);
    
      return (
        <div>
          <div>
            <h2>{details.title}</h2>
          </div>
          <img src={details.img} alt={details.title} />
          <div>
            <button
              className={activeTabs === "instructions" ? "active" : ""}
              onClick={() => setActiveTabs("instructions")}
            >
              Instructions
            </button>
            <button
              className={activeTabs === "ingredients" ? "active" : ""}
              onClick={() => setActiveTabs("ingredients")}
            >
              Ingredients
            </button>
          </div>
          <div>
            <ul>
              {activeTabs === "ingredients" &&
                details.ingredients &&
                details.ingredients.map((ingredient, index) => (
                  <li key={index}>
                    {ingredient.amount} {ingredient.ingredientValue} {ingredient.ingredientKey}
                  </li>
                ))}
            </ul>
            <ul>
              {activeTabs === "instructions" &&
                details.descriptionSteps &&
                details.descriptionSteps.map((steps, index) => (
                  <li key={index}>{steps.description}</li>
                ))}
            </ul>
          </div>
        </div>
      );
    }
    
    export default Recipe;

    endmd adlı üyeden alıntı: mesajı görüntüle
    Merhaba,
    useState e default değer girince hata alıyorum, boş bırakınca problem yok çalışıyor ama default değer girmeliyim ki butona basmadan da sayfa yüklenince listeden bir tanesi gösterilsin boş kalmasın sayfa..
    Aşağıda görüldüğü üzere activeTabs değerine göre ul list döndürecek. Hangisine tıklandıysa o liste basılacak ekrana.

    7, 61 ve 73. satırlar

    import { useEffect, useState } from "react";
    import styled from "styled-components";
    import { useParams } from "react-router-dom";
    import React from "react";
    function Recipe() {
      const [details, setDetails] = useState([]);
      const [activeTabs, setActiveTabs] = useState("ingredients");
      const params = useParams();
      const getDetails = async () => {
        const options = {
          method: "GET",
          headers: {
            "X-RapidAPI-Key": process.env.REACT_APP_MEAL_RECIPE_API_KEY,
            "X-RapidAPI-Host": "food-recipe-api.p.rapidapi.com",
          },
        };
        setDetails([]);
        await fetch(
          `https://${process.env.REACT_APP_MEAL_RECIPE_API_HOST}/recipe/${params.id}`,
          options
        )
          .then((response) => response.json())
          .then((response) => {
            setDetails(response[0]);
            console.log(response[0]);
          });
      };
      useEffect(() => {
        getDetails();
      }, [params.id]);
      return (
        <DetailWrapper>
          <div>
            <div>
            
              <h2>{details.title}</h2>
            </div>
            <img src={details.img} alt={details.title} />
          </div>
          <Info>
            <div>
        
              <Button
                className={activeTabs === "instructions" ? "active" : ""}
                onClick={() => setActiveTabs("instructions")}
              >
                Instructions
              </Button>
            </div>
            <div>
    
              <Button
                className={activeTabs === "ingredients" ? "active" : ""}
                onClick={() => setActiveTabs("ingredients")}
              >
                Ingredients
              </Button>
            </div>
            <div>
              <ul>
                {activeTabs === "ingredients" &&
                  details.ingredients.map((ingredient) => (
                    <li>
                      {ingredient.amount +
                        " " +
                        ingredient.ingredientValue +
                        " " +
                        ingredient.ingredientKey}
                    </li>
                  ))}
              </ul>
              <ul>
                {activeTabs === "instructions" &&
                  details.descriptionSteps.map((steps) => (
                    <li key={steps.step}>{steps.description}</li>
                  ))}
              </ul>
            </div>
          </Info>
        </DetailWrapper>
      );
    }
    
    export default Recipe;
  • 11-01-2023, 11:24:57
    #4
    dev
    Kurumsal Üye
    endmd adlı üyeden alıntı: mesajı görüntüle
    Merhaba,
    useState e default değer girince hata alıyorum, boş bırakınca problem yok çalışıyor ama default değer girmeliyim ki butona basmadan da sayfa yüklenince listeden bir tanesi gösterilsin boş kalmasın sayfa..
    Aşağıda görüldüğü üzere activeTabs değerine göre ul list döndürecek. Hangisine tıklandıysa o liste basılacak ekrana.

    7, 61 ve 73. satırlar

    import { useEffect, useState } from "react";
    import styled from "styled-components";
    import { useParams } from "react-router-dom";
    import React from "react";
    function Recipe() {
      const [details, setDetails] = useState([]);
      const [activeTabs, setActiveTabs] = useState("ingredients");
      const params = useParams();
      const getDetails = async () => {
        const options = {
          method: "GET",
          headers: {
            "X-RapidAPI-Key": process.env.REACT_APP_MEAL_RECIPE_API_KEY,
            "X-RapidAPI-Host": "food-recipe-api.p.rapidapi.com",
          },
        };
        setDetails([]);
        await fetch(
          `https://${process.env.REACT_APP_MEAL_RECIPE_API_HOST}/recipe/${params.id}`,
          options
        )
          .then((response) => response.json())
          .then((response) => {
            setDetails(response[0]);
            console.log(response[0]);
          });
      };
      useEffect(() => {
        getDetails();
      }, [params.id]);
      return (
        <DetailWrapper>
          <div>
            <div>
            
              <h2>{details.title}</h2>
            </div>
            <img src={details.img} alt={details.title} />
          </div>
          <Info>
            <div>
        
              <Button
                className={activeTabs === "instructions" ? "active" : ""}
                onClick={() => setActiveTabs("instructions")}
              >
                Instructions
              </Button>
            </div>
            <div>
    
              <Button
                className={activeTabs === "ingredients" ? "active" : ""}
                onClick={() => setActiveTabs("ingredients")}
              >
                Ingredients
              </Button>
            </div>
            <div>
              <ul>
                {activeTabs === "ingredients" &&
                  details.ingredients.map((ingredient) => (
                    <li>
                      {ingredient.amount +
                        " " +
                        ingredient.ingredientValue +
                        " " +
                        ingredient.ingredientKey}
                    </li>
                  ))}
              </ul>
              <ul>
                {activeTabs === "instructions" &&
                  details.descriptionSteps.map((steps) => (
                    <li key={steps.step}>{steps.description}</li>
                  ))}
              </ul>
            </div>
          </Info>
        </DetailWrapper>
      );
    }
    
    export default Recipe;
    Hata mesaji nedir?
  • 11-01-2023, 11:27:20
    #5
    gurbuzemre adlı üyeden alıntı: mesajı görüntüle
    Hata verilen state tam neresi bilmiyorum ama muhtemelen boş geldiği kısımda yazdığınız fonksiyonu çalıştırmıyordur. State adlarını kullanırken örneğin state içindeki alanı map ederken stateadi.map yerine satateadi?.map kullanırsanız, veri olduğu taktirde içeri girmesini sağlayacağı için içeri girmesini sağlar. Sanıyorum ki ingredient.amount diyorsunuz ama ilk aşamada boş olduğu için içerisine öyle bir obje gelmediği için crash oluyor onun yerine kullandığınız tüm yerleri ingredient?.amount gibi yazarsanız problem çözülecektir
    çok doğru bir noktaya bastınız sorun map in boş olması ama ben veriyi yukarıdaki getDetails fonksiyonundan alıyorum bu fonksiyon da asenkron yani veri yüklenmeden zaten return e geçmez değil mi ? O halde neden boş geliyor? Gerçi state de default değeri boş bırakınca sayfa yüklendikten sonra butona basıyorum ve map ler çalışıyor.
  • 11-01-2023, 11:27:43
    #6
    Noroc adlı üyeden alıntı: mesajı görüntüle
    Hata mesaji nedir?
    Recipe.jsx:78 Uncaught TypeError: Cannot read properties of undefined (reading 'map')
    at Recipe (Recipe.jsx:78:1)
    at renderWithHooks (react-dom.development.js:16305:1)
    at mountIndeterminateComponent (react-dom.development.js:20074:1)
    at beginWork (react-dom.development.js:21587:1)
    at HTMLUnknownElement.callCallback (react-dom.development.js:4164:1)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:1)
    at invokeGuardedCallback (react-dom.development.js:4277:1)
    at beginWork$1 (react-dom.development.js:27451:1)
    at performUnitOfWork (react-dom.development.js:26557:1)
    at workLoopSync (react-dom.development.js:26466:1)
  • 11-01-2023, 11:30:22
    #7
    endmd adlı üyeden alıntı: mesajı görüntüle
    çok doğru bir noktaya bastınız sorun map in boş olması ama ben veriyi yukarıdaki getDetails fonksiyonundan alıyorum bu fonksiyon da asenkron yani veri yüklenmeden zaten return e geçmez değil mi ? O halde neden boş geliyor? Gerçi state de default değeri boş bırakınca sayfa yüklendikten sonra butona basıyorum ve map ler çalışıyor.
    İlk aşamada, bir tane loader ekleyin, eklediğiniz loader durumu başlangıç olarak true olsun. Sayfa istek yaptıktan sonra false kısmına çekersiniz gelen veriyi alırsınız. Alt tarafta da render edilen kısımda loader true ise veri yükleniyor, loader false ise gelmiş veriyi map ederseniz probleminiz çözülecektir. Problemin kaynaklanma sebebi map ettiğiniz kısmın, gelen item içerisinde belirttiğiniz objenin olmamasından kaynaklanmasıdır. Belirsiz kısımdaki objeleri item?.objeadi gibi yazmanız, veri varsa içerisindekini yaz demek olacağı için veri olmadığı durumda hata göstermeyecektir
  • 11-01-2023, 11:35:14
    #8
    MrBektas adlı üyeden alıntı: mesajı görüntüle
    Bir de boyle deneyin calisacak mi gorelim?
    Çok teşekkürler, hemen çözüldü. Demek ki veri gelmiş mi onu da şart koşmak lazımmış . Sağolun
  • 11-01-2023, 11:38:07
    #9
    gurbuzemre adlı üyeden alıntı: mesajı görüntüle
    İlk aşamada, bir tane loader ekleyin, eklediğiniz loader durumu başlangıç olarak true olsun. Sayfa istek yaptıktan sonra false kısmına çekersiniz gelen veriyi alırsınız. Alt tarafta da render edilen kısımda loader true ise veri yükleniyor, loader false ise gelmiş veriyi map ederseniz probleminiz çözülecektir. Problemin kaynaklanma sebebi map ettiğiniz kısmın, gelen item içerisinde belirttiğiniz objenin olmamasından kaynaklanmasıdır. Belirsiz kısımdaki objeleri item?.objeadi gibi yazmanız, veri varsa içerisindekini yaz demek olacağı için veri olmadığı durumda hata göstermeyecektir
    Evet dediğiniz gibi loader eklemem çok mantıklı ve gerekli.
    Ayrıca @MrBektas;
    && details.descriptionSteps koşulu eklememi önerdi, bu da çalıştırdı. Ama loader da ayrıca eklemem daha sağlıklı olacak.
    Çok teşekkür ederim yardımlarınız için.