ėëĄęē ėęē ë ëīėĐėīęą°ë ėīíīíęļ° ėīë Īė ë ëķëķë§ ė ëĶŽ
[HTTP/ëģīė] íŽëĄėĪ ėŽėīíļ ėĪíŽëĶ―íļ ęģĩęēĐ( XSS : Cross-site Scripting Attacks ) ė°ļęģ
XSS(cross-site-scripting) ęģĩęēĐ
ėīë ėđėŽėīíļ ęīëĶŽėę° ėë ėīę° ėđ íėīė§ė ė
ėą ėĪíŽëĶ―íļëĨž ė―ė
íë ęēė ë§íëĪ.
ę·ļë°ë° ęļ°ëģļė ėžëĄ React DOMė JSXė ė―ė
ë ëŠĻë ę°ė ë ëë§íęļ° ė ė ėīėĪėžėīí
íëĪ. (ėīėĪėžėīí ė°ļęģ )
ë°ëžė, ė íëĶŽėžėīė
ėė ëŠ
ėė ėžëĄ ėėąëė§ ėė ëīėĐė ė―ė
ë ė ėëĪ.
ëĪė ë§íī, JSXė ė―ė ë ëŠĻë ę°ė ë ëë§ ëęļ° ė ė ëŽļėėīëĄ ëģíëęļ° ëëŽļė ė ėą ėĪíŽëĶ―íļëĨž ė―ė íë XSS ęģĩęēĐė ë°Đė§í ė ėë ęēėīëĪ.
<MyTextBox autocomplete />
// ėė ėëë ę°ė ííėīëĪ.
// ėžë°ė ėžëĄ propė ę°ė ė ëŽíë ęēė ęķėĨíëĪ. ES6 ëŽļëēęģž í·ę°ëĶī ė ėęļ° ëëŽļėīëĪ.
<MyTextBox autocomplete={true} />
function App1() {
return <Greeting firstName="Ben" lastName="Hector" />;
}
// ėė ėëë ę°ė ííėīëĪ.
function App2() {
const props = {firstName: 'Ben', lastName: 'Hector'};
return <Greeting {...props} />;
}
const Button = props => {
const { kind, ...other } = props;
const className = kind === "primary" ? "PrimaryButton" : "SecondaryButton";
return <button className={className} {...other} />;
};
const App = () => {
return (
<div>
<Button kind="primary" onClick={() => console.log("clicked!")}>
Hello World!
</Button>
</div>
);
};
ëģīíĩ JSXė ė―ė ë JavaScript ííėė ëŽļėėīėīë React element ëë ėīëĪė ë°°ėīëĄ íė°ëëĪ.
ę·ļëŽë, props.children
ëí ëĪëĨļ propëĪęģž ë§ė°Žę°ė§ëĄ Reactę° ë ëë§ í ė ėë ë°ėīí°ė ííëŋ ėëëž (onClick ėīëēĪíļ ëĶŽėĪë íĻėëĨž ëęļ°ë ęēėēëž) ėīëĪ ííė ë°ėīí°ë ëęēĻė§ ė ėëĪ.
ėëė ėėėėë props.childrenė íĩíīė ė―ë°ąė ëęēĻë°ė ë°ëģĩė ėļ ėŧīíŽëíļëĨž ėėąíęģ ėëĪ.
function Repeat(props) {
// console.log(props); => {numTimes: 10, children: Æ}
let items = [];
for (let i = 0; i < props.numTimes; i++) {
items.push(props.children(i));
}
return <div>{items}</div>; {/* React elementëĪė ë°°ėīė ë°ííëĪ */}
}
function ListOfTenThings() {
return (
<Repeat numTimes={10}>
{(index) => <div key={index}>This is item {index} in the list</div>} {/* props.children */}
</Repeat>
);
}
const root = document.getElementById("root");
ReactDOM.render(<ListOfTenThings />, root);
0ęģž ę°ė falsy ę°ė Reactę° ë ëë§íęļ° ëëŽļė ėĢžėíīėž íëĪ.
const falsy = 0;
const SomeComponent = () => <p>I am something else.</p>;
const Article = () => (
<div className="something">
{true && <SomeComponent />} {/* ëļëžė°ė ė <SomeComponent /> ę° ë ëë§ëĻ */}
{false && <SomeComponent />} {/* ëļëžė°ė ė ėëŽīęēë ë ëë§ëė§ ėė */}
{falsy && <SomeComponent />} {/* ëļëžė°ė ė 0ėī ë ëë§ëĻ */}
</div>
);
const root = document.getElementById("root");
ReactDOM.render(<Article />, root);
cf. true, false, undefined ę°ė ę°ė ėķë Ĩíęģ ėķëĪëĐī String(false) ėēëž ëŽļėėīëĄ ë°ęŋėž íëĪ.
ëŠĻë React ėŧīíŽëíļë ėė ė propsëĨž ëĪëĢ° ë ë°ëė ėė íĻėėēëž ëėíëĪ.
ėŧīíŽëíļ íĻė ëīëķėė ėļėëĄ ë°ė propsė ę°ė ėė íīė ėŽėĐíīėë ėëëĪ.
UIė ėžëķę° ėŽëŽ ëē ėŽėĐëęą°ë(Button, Panel, Avatar) UIė ėžëķę° ėėēīė ėžëĄ ëģĩėĄí ęē―ė°(App, FeedStory, Comment)ėë ëģëė ėŧīíŽëíļëĄ ë§ëë ęēėī ėĒëĪ.
function Img(props) { // props.user === { avatarUrl: "...", name: "..." }
return (
<img className="Avatar" src={props.user.avatarUrl} alt={props.user.name} />
);
}
function UserInfo(props) { // props.user === { avatarUrl: "...", name: "..." }
return (
<div className="UserInfo">
<Img user={props.user} />
<div className="UserInfo-name">
{props.user.name}
</div>
</div>
);
}
function Comment(props) { // props === { author: "...", text: "...", date: ... }
const formatDate = (date) => date + "ė";
return (
<div className="Comment">
<UserInfo user={props.author} />
<div className="Comment-text">
{props.text}
</div>
<div className="Comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
function App() {
const author = {
name: "Syong",
avatarUrl: "https://t1.daumcdn.net/cfile/tistory/24283C3858F778CA2E",
};
return (
<div>
<Comment author={author} text="ëëėīė
ëëĪ" date={new Date().getHours()} />
</div>
);
};
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
function UserInfo({user}) { // // props.user === { avatarUrl: "...", name: "..." }
return (
<div className="UserInfo">
<Img user={user} />
<div className="UserInfo-name">
{user.name}
</div>
</div>
);
}
function Img({user}) { // props.user === { avatarUrl: "...", name: "..." }
return (
<img className="Avatar" src={user.avatarUrl} alt={user.name} />
);
}
function Comment({author, text, date}) { // props === { author: "...", text: "...", date: "..." }
const formatDate = (date) => date + "ė";
return (
<div className="Comment">
<UserInfo user={author} />
<div className="Comment-text">
{text}
</div>
<div className="Comment-date">
{formatDate(date)}
</div>
</div>
);
}
function App() {
const author = {
name: "Syong",
avatarUrl: "https://t1.daumcdn.net/cfile/tistory/24283C3858F778CA2E",
};
return (
<div>
<Comment author={author} text="ëëėīė
ëëĪ" date={new Date().getHours()} />
</div>
);
};
const root = document.getElementById("root");
ReactDOM.render(<App />, root);