https://codesandbox.io/s/quizzical-lake-16q4o?file=/pages/index.tsx
рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХреА рдЬрдЧрд╣ рд▓реЗрддреЗ рд╕рдордп, рдЕрд╕рддреНрдп рд╣рдореЗрд╢рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ?
рдореБрджреНрджрд╛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @purp1eeeee
рдЖрдкрдХреЗ рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддрддреНрд╡ рдирд╣реАрдВ рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд░реАрдбрдореА рджреЗрдЦреЗрдВред
рддреЛ рдХреНрдпрд╛ рдЖрдк рд▓реЙрдЧ рдХреЛ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХреА рд╡рд╛рдкрд╕реА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ?
export default function IndexPage() {
const html = "<h1>hoge</h1>";
const options: HTMLReactParserOptions = {
replace: (domNode) => {
- console.log(domNode);
- console.log(domNode instanceof Element);
+ if (domNode.name === "h1") {
+ return <h1>replaced</h1>;
+ }
}
};
return <div>{parse(html, options)}</div>;
}
рдЕрджреНрдпрддрди рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рджреЗрдЦреЗрдВред
рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдФрд░ рдореИрдВ рднреА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореИрдВ рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ attribs
рд╕реЗ domNode
ред
рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдЬрд╛рдБрдЪ domNode
рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ DOMNode
, рдирд╣реАрдВ Element
, рдкреНрд░рдХрд╛рд░ рддреЛ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ DOMNode
рдирд╣реАрдВ рд╣реИ attribs
рд╕рдВрдкрддреНрддрд┐ред
рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рддреЛ console.log(domNode instanceof Element)
рд░рд┐рдЯрд░реНрди рд╣рдореЗрд╢рд╛ рдЭреВрдард╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЛрдордиреЛрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг DOMNode
ред
рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╢рд╛рдпрдж рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ domNode рдкрд░ Element
рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред
import parse, { HTMLReactParserOptions } from "html-react-parser";
import { Element } from "domhandler/lib/node";
export function contentHandler(postContent: string) {
const options: HTMLReactParserOptions = {
replace: (domNode: Element) => {
if (domNode.attribs) {
if (domNode.attribs.id === 'shortcode') {
return <div className="leadform">Shortcode</div>;
}
}
},
};
return parse(postContent, options);
}
рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ Next.js рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ; рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдк-рдХрд╛рд╕реНрдЯрд┐рдВрдЧ domNode
рдПрдЪрдЯреАрдПрдордПрд▓-рд░рд┐рдПрдХреНрд╢рди-рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХрдорд╛рддреНрд░ рдХрд╛рдо рд╣реИред
@kakaeriel
рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛! рдзрдиреНрдпрд╡рд╛рдж
рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЗрди рдореБрджреНрджреЛрдВ рдХрд╛ рд╣реЛрдирд╛ред @kakaeriel рдХреА рддрд░рд╣ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЕрдиреБрднрд╛рдЧ рд╕рд╣рд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
@kakaeriel рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред instanceof
рдСрдкрд░реЗрдЯрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рддрддреНрд╡ рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдШрдВрдЯреЛрдВ рдХреЗ рдмрд╛рдж node_modules рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдирд╛ рдПрдХ рдЬреАрд╡рди рд░рдХреНрд╖рдХ рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди @kakaeriel рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рдЖрдк README.md
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ?
@remarkablemark рд╣рд╛рдБ рдЬрд╝рд░реВрд░! рдореИрдВ рдПрдХ рдкреАрдЖрд░, ASAP рдмрдирд╛рдКрдВрдЧрд╛ред
рд╡рд╛рд╣ рд╡рд╛рд╣ред рдореБрдЭреЗ NextJS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдЬрд╛рдБрдЪ
domNode
рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИDOMNode
, рдирд╣реАрдВElement
, рдкреНрд░рдХрд╛рд░ рддреЛ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣DOMNode
рдирд╣реАрдВ рд╣реИattribs
рд╕рдВрдкрддреНрддрд┐ред```
рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдиреЗрдХреНрд╕реНрдЯрдЬреЗрдПрд╕ рдРрдк рдореЗрдВ рд╣реА рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИред
рдореИрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдРрдк рд╕реЗрдЯрдЕрдк рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╡рд╣рд╛рдВ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
https://codesandbox.io/s/html-parsing-and-replaceing-elements-yjtv7?file=/src/index.tsx
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ @ Naxos84ред рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ Next.js рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред рдХреГрдкрдпрд╛ @kakaeriel рдХреЗ рдмрд╛рд╣рд░ рдХреА рдЬрд╛рдБрдЪ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдПред
@kakaeriel рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд╕рд╛рде README.md
рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдЦреЛрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдпрджрд┐ рдЖрдк рдпрд╣ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИрдВ, рддреЛ рдореИрдВ рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдзрдиреНрдпрд╡рд╛рдж!
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдиреЗрдХреНрд╕реНрдЯрдЬреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдореИрдВрдиреЗ рдереЛрдбрд╝реА рдФрд░ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рд╡реЛрдЗрд▓рд╛ рдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд┐рдпрд╛ред
рдореИрдВрдиреЗ @remarkablemark codesandbox рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ console.log(domElement.constructor)
рдЬреЛрдбрд╝рд╛ рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИ:
рддреЛ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣ рдЕрдЪрд╛рдирдХ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ !?
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ "my" nextjs рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЕрджреНрдпрддрди: рдФрд░ рдЕрдм рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ ....
рдореИрдВ рдПрдХ рдХрд╕реНрдЯрдо рдЯрд╛рдЗрдкрдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред
const isElement = (domNode: DOMNode): domNode is Element => {
const isTag = domNode.type === "tag";
const hasAttributes = (domNode as Element).attribs !== undefined;
return isTag && hasAttributes;
};
const parserOptions: HTMLReactParserOptions = {
replace: domNode => {
if (isElement(domNode)) {
return <p>It's an element.</p>;
} else {
return <p>It's something else</p>;
}
},
};
рд╣реЗ рд╕рдм рд▓реЛрдЧ, рдореИрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде Next.js 10.x рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд╛рд░ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рд╕реЗрдЯрдЕрдк рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред
@natterstefan рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдореБрдЭреЗ NextJS рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рддрддреНрд╡ рд╣рдореЗрд╢рд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдбреЛрдордиреЛрдб рдХреЛ рдХрд┐рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рдХреЛ HTMLReactParserOptions рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ред рдбреЛрдорд╣реИрдВрдбрд▓рд░ рд╕реЗ рддрддреНрд╡ рдПрд╕рдПрд╕рдЖрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?
const options = {
replace: (domNode: any) => {
// ...
}
} as HTMLReactParserOptions;
рдореИрдВ рдЗрд╕реЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдФрд░ рдореИрдВ рднреА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореИрдВ рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ
attribs
рд╕реЗdomNode
редрдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдЬрд╛рдБрдЪ
domNode
рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИDOMNode
, рдирд╣реАрдВElement
, рдкреНрд░рдХрд╛рд░ рддреЛ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣DOMNode
рдирд╣реАрдВ рд╣реИattribs
рд╕рдВрдкрддреНрддрд┐редрдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рддреЛ
console.log(domNode instanceof Element)
рд░рд┐рдЯрд░реНрди рд╣рдореЗрд╢рд╛ рдЭреВрдард╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЛрдордиреЛрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдгDOMNode
редрдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╢рд╛рдпрдж рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ domNode рдкрд░
Element
рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред