<div>, <p> soyundan gelemez


125

Bunu görüyorum. Neden şikayet ettiği bir sır değil:

Warning: validateDOMnesting(...): <div> cannot appear as a descendant of <p>. See ... SomeComponent > p > ... > SomeOtherComponent > ReactTooltip > div.

Ben yazarı olduğum SomeComponentve SomeOtherComponent. Ancak ikincisi harici bir bağımlılık kullanıyor ( ReactTooltipkimden react-tooltip). Muhtemelen bunun harici bir bağımlılık olması gerekli değildir, ancak buradaki argümanı "kontrolüm dışında olan bir kod" olarak denememe izin veriyor.

Yuvalanmış bileşenin gayet iyi çalıştığı (görünüşte) göz önüne alındığında, bu uyarı hakkında ne kadar endişelenmeliyim? Ve yine de bunu nasıl değiştirebilirim (harici bir bağımlılığı yeniden uygulamak istemiyorsam)? Henüz farkında olmadığım daha iyi bir tasarım var mı?

Tamlık uğruna, işte uygulaması SomeOtherComponent. Yalnızca oluşturulur this.props.valueve üzerine gelindiğinde: "Bazı araç ipucu mesajı" yazan bir araç ipucu:

class SomeOtherComponent extends React.Component {
  constructor(props) {
    super(props)
  }

  render() {
    const {value, ...rest} = this.props;
    return <span className="some-other-component">
      <a href="#" data-tip="Some tooltip message" {...rest}>{value}</a>
      <ReactTooltip />
    </span>
  }
}

Teşekkür ederim.


Yanıtlar:


121

Material UI <Typography> https://material-ui.com/api/typography/ kullanılırken bu hata meydana gelirse , elementin özniteliğinin değerini değiştirerek kolayca <p>a <span>olarak değiştirebilirsiniz :component<Typography>

<Typography component={'span'} variant={'body2'}>

Tipografi belgelerine göre:

bileşen: Kök düğüm için kullanılan bileşen. DOM öğesi veya bileşen kullanılacak bir dize. Varsayılan olarak, varyantı iyi bir varsayılan başlık bileşeniyle eşler.

Yani Tipografi, <p>değiştirebileceğiniz mantıklı bir varsayılan olarak seçim yapıyor. Yan etkilerle gelebilir ... benim için çalıştı.


SEO açısından talihsiz bir durum, özellikle bileşenin bir başlık olmasını (tanınmasını) istiyorsanız, ancak h4 gibi bir varyantla.
2019

Daha fazla kafa yorarsak, varyant = "miras" (yani sayfa düzeyinde) olan bir kök Tipografi öğesine ve ardından bir alt Tipografi bileşeni = "h1" varyant = "h5" olabilir. İşe yarıyor gibi görünüyor, ancak Tipografiyi doğru şekilde kullandığımdan tam olarak emin değilim ...
pfeds

7
Ben kullandım <Typography component={'div'}>ve şimdi uyarı olmadan çalışıyor. Beni doğru yola soktuğun için çok teşekkür ederim!
JohnK

Metnimin sayfada doğru görüntülenmesi için div'imi özetlemek için bir tipografiye ihtiyacım vardı. Üst öğe olarak olmadan css sınıfım doğru kaydedilmiyor gibi görünüyordu, garip değil mi? Ancak bu bir cazibe gibi çalıştı, css kaydedildi ve hatalarımı kaldırdı, tatlı!
C.Gadd

5
Bu gerçek bir zaman kazandıran cevaptır
YaakovHatam

78

Uyarı mesajına bağlı olarak, ReactTooltip bileşeni şuna benzeyen bir HTML oluşturur:

<p>
   <div>...</div>
</p>

Bu belgeye göre , bir <p></p>etiket yalnızca satır içi öğeler içerebilir. Bu <div></div>, divetiket bir blok öğesi olduğundan, içine bir etiket koymanın uygunsuz olması gerektiği anlamına gelir . Yanlış iç içe yerleştirme , fazladan etiketlerin oluşturulması gibi sorunlara neden olabilir ve bu da javascript ve css'nizi etkileyebilir.

Bu uyarıdan kurtulmak istiyorsanız, ReactTooltip bileşenini özelleştirmek veya oluşturucunun bu uyarıyı düzeltmesini beklemek isteyebilirsiniz.


Öyleyse, evet, neyin işlendiğini anladım, ancak o zaman a'yı oluşturan herhangi bir bileşenin, diva'da kullanılma ihtimaline göre yeniden düzenlenmesi gerektiğini söyleyebilir misiniz p? Bir divşeyleri keyfi bir şekilde paketlemenin ne kadar popüler olduğu karşısında uçuyor gibi görünüyor ?
Sander Verhagen

2
Sanırım öyle, çünkü w3c tavsiyesinde yer alıyor. Ayrıca, bu tür bir uyarıdan kaçınmak için, ancak kodun mantığındaki hiçbir şeyi etkilemeden a'yı kolayca a divile değiştirebiliriz span.
JD Hernandez

1
Materyal UI <Tipografi> 'yi doğrudan kullanırken bu hatayı alırsanız, aşağıda cevabımda tanımladığım "bileşeni" değiştirebilirsiniz. Umarım bu yardımcı olur
zayquan

<p> içinde <div> yerine <span> kullanmayı deneyin - Bu sorunu çözecektir. Bu hatayla, kaynağı bir üst css sınıfı tarafından belirtilen bir görüntüyü görüntülemek için <div> kullanarak karşılaştım.
Christopher Stok

21

Bunun nerede olduğunu arıyorsanız, konsolda şunları kullanabilirsiniz: document.querySelectorAll(" p * div ")


17

Bileşeniniz başka bir bileşenin (a gibi <Typography> ... </Typography>) içinde işlenebilir . Bu nedenle, bileşeninizi <p> .. </p>izin verilmeyen bir içine yükleyecektir .

Düzeltme: Kaldır <Typography>...</Typography>çünkü bu yalnızca bir <p>...</p>veya başlıklar gibi başka herhangi bir metin öğesi içindeki düz metin için kullanılır .


4
Ben kullandım <Typography component={'div'}>ve şimdi uyarı olmadan çalışıyor. Beni doğru yola soktuğun için çok teşekkür ederim!
JohnK

11

Bu uyarıyı Material UI bileşenlerini kullanarak aldım , ardından component="div"as prop'u aşağıdaki koda test ettim ve her şey doğru oldu:

import Grid from '@material-ui/core/Grid';
import Typography from '@material-ui/core/Typography';

<Typography component="span">
  <Grid component="span">
    Lorem Ipsum
  </Grid>
</Typography>

Aslında bu uyarı, Malzeme Kullanıcı Arabiriminde Gridbileşenin divvarsayılan TypographyHTML etiketinin etiket olması ve varsayılan HTML etiketinin etiket olması pnedeniyle oluşur. Artık uyarı gerçekleşir,

Warning: validateDOMnesting(...): <div> cannot appear as a descendant of <p>

Kısaca, Material UI'de hatalar var mı?
Ero Stefano

1
Hayır sevgili @EroStefano, bu kasıtlı olarak geliştiricinin satır içi ve blok seviyelerinin hiyerarşisi kuralına uymasıdır.
AmerllicA

6

Bu, tarayıcıların bir kısıtlamasıdır. App render yönteminde div veya article veya bunun gibi bir şey kullanmalısınız çünkü bu şekilde içine istediğinizi koyabilirsiniz. Paragraf etiketleri, yalnızca sınırlı bir etiket kümesi içermekle sınırlıdır (çoğunlukla metni biçimlendirmek için etiketler. Paragraf içinde bir div olamazsınız.

<p><div></div></p>

geçerli HTML değil. Spec listelenen etiket ihmal kuralları gereği, <p>etiketi otomatik tarafından kapatılır <div>yaprakları etiketi, </p>bir eşleme olmadan etiketi <p>. Tarayıcı, <p>şunlardan sonra açık bir etiket ekleyerek düzeltmeyi deneme hakkına sahiptir <div>:

<p></p><div></div><p></p>

İçine bir a <div>ekleyip <p>çeşitli tarayıcılardan tutarlı sonuçlar alamazsınız . Tarayıcılara geçerli HTML sağlayın ve daha iyi davranacaklardır.

Sen koyabilirsiniz <div>bir iç <div>Eğer değiştirmek eğer öyleyse olsa <p>ile <div class="p">uygun şekilde, istediğini elde edebilirsiniz ve stil.


1
peki bunu nasıl takip ediyorsunuz? hatalar sıraya
giriyor

6

Uyarı yalnızca demo kodunun aşağıdakilere sahip olması nedeniyle görünür:

function TabPanel(props) {
  const { children, value, index, ...other } = props;

  return (
    <div
      role="tabpanel"
      hidden={value !== index}
      id={`simple-tabpanel-${index}`}
      aria-labelledby={`simple-tab-${index}`}
      {...other}
    >
      {value === index && (
        <Box p={3}>  // <==NOTE P TAG HERE
          <Typography>{children}</Typography>
        </Box>
      )}
    </div>
  );
}

Bunu şu şekilde değiştirirseniz hallederiz:

function TabPanel(props) {
    const {children, value, index, classes, ...other} = props;

    return (
        <div
            role="tabpanel"
            hidden={value !== index}
            id={`simple-tabpanel-${index}`}
            aria-labelledby={`simple-tab-${index}`}
            {...other}
        >
            {value === index && (
                <Container>
                    <Box>   // <== P TAG REMOVED
                        {children}
                    </Box>
                </Container>
            )}
        </div>
    );
}

1
Tanrı seni korusun. Kendi bileşenlerimi inceleyerek çok fazla zaman harcadım
M.Dada

4

Benzer bir sorunla karşılaştım ve bileşeni "p" yerine "div" içine sardım ve hata ortadan kalktı.


2

Kullanıyorsanız ReactTooltip, uyarının kaybolmasını sağlamak için, artık aşağıdaki gibi wrapperdeğerine sahip bir destek ekleyebilirsiniz span:

<ReactTooltip wrapper="span" />

Yana spanbir satır içi unsurdur, artık şikayet etmeli.


Sen en iyi arkadaşımsın, en iyilerin en iyisisin. Seni seviyorum.
AmerllicA

2

Bunu , React'teki <Card.Text>bir <Card>bileşenin bir bölümünde özel bir bileşen kullanarak aldım . Bileşenlerimden hiçbiri p etiketlerinde değildi


-1

aldığım hata

 <p>
  <UserList userId={post.id} />
 </p>

Warning: validateDOMNesting(...): <div> cannot appear as a descendant of <p>bu hatayı gösteriyor çünkü Kullanıcı Listesinin içinde <div>UserList</div> çok yanlış

- Standart p veya div içindeki herhangi bir etiketi çağırabiliriz

- Ama benim durumumda p içinde div olarak adlandırıyorum, bu yüzden hata alıyorum

olmalı

   <div>
      <UserList userId={post.id} />
     </div>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.