<div> <p> এর বংশধর হিসাবে উপস্থিত হতে পারে না


123

আমি এই দেখছি। এটি কোন রহস্য নয় যা এটি অভিযোগ করছে:

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

আমি এর লেখক SomeComponentএবং SomeOtherComponent। তবে পরেরটি বাহ্যিক নির্ভরতা ( ReactTooltipথেকে react-tooltip) ব্যবহার করছে। এটি বাহ্যিক নির্ভরতা সম্ভবত এটি অপরিহার্য নয়, তবে এটি আমাকে এখানে যুক্তিটি দেখতে দেয় যে এটি "এমন কিছু কোড যা আমার নিয়ন্ত্রণের বাইরে"।

নেস্টেড উপাদানটি ঠিকঠাকভাবে কাজ করছে (আপাতদৃষ্টিতে) এই সতর্কতা সম্পর্কে আমার কতটা চিন্তিত হওয়া উচিত? এবং যেভাবেই হোক আমি কীভাবে এটি পরিবর্তন করতে যাব (প্রদত্ত আমি কোনও বাহ্যিক নির্ভরতা পুনরায় প্রয়োগ করতে চাই না)? এমন কি আরও ভাল নকশা আছে যা সম্পর্কে আমি এখনও অবগত নই?

সম্পূর্ণতার জন্য, এর বাস্তবায়ন এখানে SomeOtherComponent। এটি কেবল রেন্ডার করে this.props.value, এবং যখন আটকানো হয়: এমন একটি সরঞ্জামদণ্ড যা "কিছু সরঞ্জামদণ্ডের বার্তা" বলে:

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>
  }
}

ধন্যবাদ.


4
সম্পর্কিত সমস্যা: github.com/wwayne/react-tooltip/issues/210
জর্ডান চলমান

উত্তর:


121

এই ত্রুটি দেখা দেয় মেটারিয়াল UI ব্যবহার করার সময় যদি <Typography> https://material-ui.com/api/typography/ , তাহলে আপনি খুব সহজেই পরিবর্তন করতে পারেন <p>একটি থেকে <span>এর মান পরিবর্তন করে componentএর অ্যাট্রিবিউট <Typography>উপাদান:

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

টাইপোগ্রাফি ডক্স অনুসারে:

উপাদান: মূল নোডের জন্য ব্যবহৃত উপাদান। হয় DOM উপাদান বা উপাদান ব্যবহার করার জন্য একটি স্ট্রিং। ডিফল্টরূপে, এটি একটি ভাল ডিফল্ট শিরোনাম উপাদান রূপান্তর মানচিত্র।

সুতরাং টাইপোগ্রাফিটি <p>একটি বুদ্ধিমান ডিফল্ট হিসাবে বাছাই করছে , যা আপনি পরিবর্তন করতে পারেন। পার্শ্ব প্রতিক্রিয়া সঙ্গে আসতে পারে ... আমার জন্য কাজ।


এটি SEO এর দিক থেকে দুর্ভাগ্যজনক, বিশেষত যদি আপনি উপাদানটি শিরোনাম হতে চান (স্বীকৃত হতে) তবে এইচ 4 এর মতো কোনও পরিবর্তনের সাথে।
'14 এ এফিডেডস

আরও চারপাশে ত্রুটিযুক্ত মনে হচ্ছে আপনার বৈকল্পিক = "উত্তরাধিকারী" (অর্থাত্ পৃষ্ঠা স্তরের) সহ একটি মূল টাইপোগ্রাফি উপাদান থাকতে পারে এবং তারপরে একটি উপ টাইপোগ্রাফি উপাদান = "এইচ 1" ভেরিয়েন্ট = "এইচ 5" থাকতে পারে। এটি কাজ করছে বলে মনে হচ্ছে, তবে আমি সম্পূর্ণরূপে নিশ্চিত নই যে আমি টাইপোগ্রাফিটি সঠিক উপায়ে ব্যবহার করছি ...
pfeds

6
আমি ব্যবহার করেছি <Typography component={'div'}>এবং এটি এখন সতর্কতা ছাড়াই কাজ করে। আমাকে সঠিক পথে রাখার জন্য আপনাকে অনেক ধন্যবাদ!
JohnK

আমার ডিভিটি সজ্জিত করার জন্য আমার একটি টাইপোগ্রাফির প্রয়োজন ছিল যাতে পৃষ্ঠায় আমার পাঠ্যটি সঠিকভাবে প্রদর্শিত হয়। এটি একটি প্যারেন্ট উপাদান হিসাবে ছাড়া আমার সিএসএস ক্লাসটি সঠিকভাবে নিবন্ধিত হতে পারে বলে মনে হচ্ছে না, অদ্ভুত? তবে এটি একটি কবজির মতো কাজ করেছে, সিএসএস নিবন্ধিত হয়েছে এবং এটি আমার ত্রুটিগুলি সরিয়ে দিয়েছে, মিষ্টি!
সিড্যাড

4
এটি রিয়েল টাইম সেভারের উত্তর
ইয়াকভ হাটাম

76

সতর্কতা বার্তার উপর ভিত্তি করে, উপাদানটি প্রতিক্রিয়াশক্তিটি এমন একটি এইচটিএমএলকে রেন্ডার করে:

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

এই দস্তাবেজ অনুসারে , একটি <p></p>ট্যাগে কেবল ইনলাইন উপাদান থাকতে পারে। এর অর্থ <div></div>এটির ভিতরে ট্যাগ লাগানো অনুচিত হওয়া উচিত, যেহেতু divট্যাগটি একটি ব্লক উপাদান। অন্যায়ভাবে বাসা বাঁধার কারণে অতিরিক্ত ট্যাগগুলি সরবরাহ করার মতো সমস্যা দেখা দিতে পারে যা আপনার জাভাস্ক্রিপ্ট এবং সিএসএসকে প্রভাবিত করতে পারে।

আপনি যদি এই সতর্কতা থেকে মুক্তি পেতে চান তবে আপনি রিঅ্যাকটুলটিপ উপাদানটি কাস্টমাইজ করতে চাইতে পারেন, বা এই সতর্কতাটি ঠিক করার জন্য স্রষ্টার অপেক্ষা করতে পারেন।


সুতরাং, হ্যাঁ, আমি বুঝতে পেরেছি কি রেন্ডার করা হয়েছিল, তবে আপনি কি বলবেন যে কোনও উপাদান যে একটি রেন্ডার করে divতা একটিতে ব্যবহারের সুযোগে রিফেক্টর করা উচিত p? মনে হয় এটি divনির্বিঘ্নে মোড়কের জিনিসপত্রের জন্য কতটা জনপ্রিয় হয়েছে?
Sander Verhagen

4
আমার ধারণা তাই, যেহেতু এটি ডাব্লু 3 সি সুপারিশে রয়েছে। এছাড়াও, আমরা এই ধরণের সতর্কতা এড়াতে সহজেই একটি divদিয়ে প্রতিস্থাপন করতে পারি spanতবে কোডটির লজিকের কোনও কিছুই প্রভাবিত না করে।
জেডি হার্নান্দেজ

4
যদি আপনি এই ত্রুটিটি মেটেরিয়াল ইউআই <টিপোগ্রাফি> ব্যবহার করার সময় পান তবে আপনি সরাসরি "উপাদান" পরিবর্তন করতে পারেন, যা আমি আমার উত্তরে নীচে বর্ণনা করছি। আশা করি এটি সহায়তা করে
zayquan

আপনার <p> এর ভিতরে <ডিভ> এর পরিবর্তে <span> ব্যবহার করার চেষ্টা করুন - এটি এটি ঠিক করা উচিত। এই উত্সটি কোনও পিতামাতার সিএসএস শ্রেণীর দ্বারা নির্দিষ্ট করা উত্স হিসাবে প্রদর্শিত একটি চিত্র প্রদর্শনের জন্য <ডিভ> ব্যবহার করে আমি এই ত্রুটিটিভুক্ত হয়েছি।
ক্রিস্টোফার স্টক

21

এটি কোথায় ঘটছে তা যদি সন্ধান করে থাকেন তবে কনসোলে আপনি এটি ব্যবহার করতে পারেন: document.querySelectorAll(" p * div ")


17

আপনার উপাদানটি অন্য কোনও উপাদান (যেমন একটি <Typography> ... </Typography>) এর মধ্যে রেন্ডার হতে পারে । অতএব, এটি আপনার উপাদানটি একটি এর মধ্যে লোড করবে<p> .. </p> এমন কোনও যা অনুমোদিত নয়।

স্থির করুন: সরান <Typography>...</Typography>কারণ এটি কেবল কোনও <p>...</p>বা অন্য কোনও পাঠ্য উপাদানের যেমন শিরোনামের অভ্যন্তরে সরল পাঠ্যের জন্য ব্যবহৃত হয় ।


4
আমি ব্যবহার করেছি <Typography component={'div'}>এবং এটি এখন সতর্কতা ছাড়াই কাজ করে। আমাকে সঠিক পথে রাখার জন্য আপনাকে অনেক ধন্যবাদ!
JohnK

11

আমি ম্যাটারিয়াল ইউআই উপাদান ব্যবহার করে এই সতর্কতাটি পেয়েছি , তারপরে আমি component="div"নীচের কোডটির প্রপ হিসাবে পরীক্ষা করি এবং সবকিছু ঠিক হয়ে যায়:

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

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

প্রকৃতপক্ষে, এই সতর্কতাটি ঘটে কারণ উপাদান ইউআইতে Gridউপাদানগুলির ডিফল্ট এইচটিএমএল ট্যাগ divট্যাগ হয় এবং ডিফল্ট Typographyএইচটিএমএল ট্যাগ ট্যাগ হয় p, সুতরাং এখন সতর্কতাটি ঘটে,

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

সংক্ষেপে কথায় আছে ম্যাটেরিয়াল ইউআইতে কি বাগ রয়েছে?
এরো স্টেফানো

4
প্রিয় ইরোস্টেফানো না, এটি ইচ্ছাকৃত যে বিকাশকারী ইনলাইন এবং ব্লক স্তরের স্তরক্রমের নিয়মটি অনুসরণ করে।
আমেরেলিকাএ

6

এটি ব্রাউজারগুলির একটি সীমাবদ্ধতা। অ্যাপের রেন্ডার পদ্ধতিতে আপনার ডিভ বা নিবন্ধ বা এর মতো কিছু ব্যবহার করা উচিত কারণ আপনি যা চান তার ভিতরে রাখতে পারেন। অনুচ্ছেদে ট্যাগগুলি কেবলমাত্র সীমিত সেটগুলিতে সীমাবদ্ধ রয়েছে (বেশিরভাগ ট্যাগ বিন্যাসের পাঠ্যের জন্য। আপনার অনুচ্ছেদে কোনও ডিভ থাকতে পারে না

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

বৈধ এইচটিএমএল নয়। বৈশিষ্টটিতে তালিকাভুক্ত ট্যাগ বাদ দেওয়ার নিয়ম অনুসারে <p>ট্যাগটি স্বয়ংক্রিয়ভাবে ট্যাগটি বন্ধ হয়ে যায় <div>, যা </p>কোনও মিল ছাড়াই ট্যাগটিকে ছেড়ে দেয় <p>। ব্রাউজারটি তার <p>পরে একটি খোলা ট্যাগ যুক্ত করে এটি সংশোধন করার চেষ্টা করার অধিকারগুলির মধ্যে রয়েছে <div>:

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

আপনি একটি এর <div>ভিতরে একটি রাখতে পারবেন না <p>এবং বিভিন্ন ব্রাউজার থেকে ধারাবাহিক ফলাফল পেতে পারেন। বৈধ এইচটিএমএল সহ ব্রাউজারগুলি সরবরাহ করুন এবং তারা আরও ভাল আচরণ করবে।

আপনি কিছুটা <div>ভিতরে রাখতে পারেন <div>সুতরাং আপনি যদি এটির <p>সাথে প্রতিস্থাপন করেন <div class="p">এবং এটি যথাযথভাবে স্টাইল করেন তবে আপনি যা চান তা পেতে পারেন।


4
সুতরাং আপনি এই ট্র্যাক কিভাবে? ত্রুটিগুলি
রেখেছে

5

সতর্কতাটি কেবলমাত্র ডেমো কোডের কারণে প্রদর্শিত হবে:

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>
  );
}

এটির মতো পরিবর্তন করা এটির যত্ন নেয়:

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>
    );
}

4
আল্লাহ্ তোমার মঙ্গল করুক. আমার নিজের উপাদানগুলি যাচাই করে এত সময় নষ্ট করেছেন
এম দাদা

4

আমার অনুরূপ সমস্যা ছিল এবং উপাদানটি "ডি" এর পরিবর্তে "পি" এর পরিবর্তে "ডিভ" এ মুড়ে ফেলা হয় এবং ত্রুটিটি চলে যায়।


2

ReactTooltipসতর্কতা অদৃশ্য করতে আপনি যদি ব্যবহার করে থাকেন তবে আপনি এখন wrapperএর spanমতো একটি মান সহ একটি প্রপ যোগ করতে পারেন :

<ReactTooltip wrapper="span" />

যেহেতু এটি spanএকটি ইনলাইন উপাদান, এটি আর অভিযোগ করা উচিত নয়।


আপনি সেরা আমার বন্ধু, সেরা বেষ্টনী। তোমাকে ভালোবাসি.
আমেরেলিকাএ

2

আমি প্রতিক্রিয়াতে <Card.Text>কোনও <Card>উপাদানগুলির একটি বিভাগের অভ্যন্তরে একটি কাস্টম উপাদান ব্যবহার করে এটি পেয়েছি । আমার কোনও উপাদানই প ট্যাগগুলিতে ছিল না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.