您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“react基礎語法使用實例分析”,內容詳細,步驟清晰,細節處理妥當,希望這篇“react基礎語法使用實例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
一、渲染元素(函數方法、es6方式)
1、函數方法代碼如下:
function Clock(props) {
return (
<div>
<h2>Hello, world!</h2>
<h3>現在是 {props.date.toLocaleTimeString()}.</h3>
</div>
);
}
function tick() {
ReactDOM.render(
<Clock date={new Date()} />,
document.getElementById('example')
);
}
setInterval(tick, 1000);
2、es6方法代碼如下:
class Clock extends React.Component {
render() {
return (
<div>
<h2>Hello, world!</h2>
<h3>現在是 {this.props.date.toLocaleTimeString()}.</h3>
</div>
);
}
}
function tick() {
ReactDOM.render(
<Clock date={new Date()} />,
document.getElementById('example')
);
}
setInterval(tick, 1000);
二、組件
1、使用函數定義組件,代碼如下:
function HelloMessage(props) {
return <h2>Hello World!</h2>;
}
也可以使用ES6 class 來定義組件,代碼如下:
class Welcome extends React.Component {
render() {
return <h2>Hello World!</h2>;
}
}
2、如果我們碰到需要向組件傳遞參數的話,我們可以使用this.props
對象,代碼如下:
function HelloMessage(props) {
return <h2>Hello {props.name}!</h2>;
}
const element = <HelloMessage name="Runoob"/>;
ReactDOM.render(
element,
document.getElementById('example')
);
當然我們在添加屬性的時候,class
屬性需要寫成class Name
,對于for
屬性的話我們則需要寫成htmlFor
,這是為什么呢?因為class
和for
是JavaScript的保留字,所以需要這么做。
3、復合組件
對于復合組件的話我們可以通過創建多個組件來進行組合成一個組件,既可以把不同的功能的組件進行分離,代碼如下:
<script type="text/babel">
function Name(props) {
return <h2>名稱:{props.name}</h2>;
}
function Url(props) {
return <h2>地址:{props.url}</h2>;
}
function Nickname(props) {
return <h2>小名:{props.nickname}</h2>;
}
function App() {
return (
<div>
<Name name="Tom" />
<Url url="https://www.cnblogs.com/freedom-feng/" />
<Nickname nickname="Jack" />
</div>
);
}
ReactDOM.render(
<App />,
document.getElementById('example')
);
</script>
三、事件
當我們在通過使用ES6 class語法來定義一個組件的時候,事件處理器會成為類的一個方法,如下這個方法,我們通過Toggle組件渲染出一個可以讓用戶切換開關狀態的按鈕,代碼如下:
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true};
// 這邊綁定是必要的,這樣 `this` 才能在回調函數中使用
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
}
ReactDOM.render(
<Toggle />,
document.getElementById('example')
);
但是呢,我們在使用的時候要注意;類的方法默認是不會綁定this的,如果我們忘記綁定this.handleClick
并把它傳入onClik
,當你調用這個函數的時候this
的值會是undefined
,當然我們還可以使用下面這兩種方式類解決;
(1)、當我們使用實驗性的屬性初始化器語法時,我們可以使用屬性初始化器來正確的綁定回調函數,代碼如下:
<script type="text/babel">
class LoggingButton extends React.Component {
// 這個語法確保了 `this` 綁定在 handleClick 中
// 這里只是一個測試
handleClick = () => {
console.log('this is:', this);
}
render() {
return (
<button onClick={this.handleClick}>
Click me
</button>
);
}
}
ReactDOM.render(
<LoggingButton />,
document.getElementById('example')
);
</script>
(2)、如果沒有使用屬性化器語法的話我們可以回調函數中使用的箭頭函數,代碼如下:
class LoggingButton extends React.Component {
handleClick() {
console.log('this is:', this);
}
render() {
// 這個語法確保了 `this` 綁定在 handleClick 中
return (
<button onClick={(e) => this.handleClick(e)}>
Click me
</button>
);
}
}
事件傳參代碼如下:
<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
對于上面這兩種方法是等價的,而且在我們的案例中參數e
作為時間對象將被作為第二個參數進行傳遞。通過箭頭函數的方式,事件對象必須顯式的進行傳遞,但是通過bind
的方式,時間對象以及更多的參數將會被隱式的進行傳遞。當然我們還要注意:需要通過bind
方式向監聽函數傳參,在類組件中定義的監聽函數,事件對象e要排在所傳參數的后面,代碼如下:
<script type="text/babel">
class Popper extends React.Component{
constructor(){
super();
this.state = {name:'Hello world!'};
}
preventPop(name, e){ //事件對象e要放在最后
e.preventDefault();
alert(name);
}
render(){
return (
<div>
<p>hello</p>
{/* 通過 bind() 方法傳遞參數。 */}
<button onClick={this.preventPop.bind(this,this.state.name)}>Click</button>
</div>
);
}
}
ReactDOM.render(
<Popper />,
document.getElementById('example')
);
</script>
四、條件渲染
我們在講解條件渲染是先看看這兩個組件,代碼如下:
function UserGreeting(props) {
return <h2>歡迎回來!</h2>;
}
function GuestGreeting(props) {
return <h2>請先注冊。</h2>;
}
之后我們在創建個Greeting
組件,這個組件會根據用戶是否登錄來顯示其中之一,代碼如下:
function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return <UserGreeting />;
}
return <GuestGreeting />;
}
ReactDOM.render(
// 嘗試修改 isLoggedIn={true}:
<Greeting isLoggedIn={false} />,
document.getElementById('example')
);
五、元素變量
我們可以使用變量來儲存元素。它可以幫助你有條件的渲染組件的一部分,而輸出的其他部分不會更改。在下面的例子中,我們將要創建一個名為 LoginControl
的有狀態的組件。它會根據當前的狀態來渲染 <LoginButton />
或 <LogoutButton />
,它也將渲染前面例子中的 <Greeting />
。代碼如下:
class LoginControl extends React.Component {
constructor(props) {
super(props);
this.handleLoginClick = this.handleLoginClick.bind(this);
this.handleLogoutClick = this.handleLogoutClick.bind(this);
this.state = {isLoggedIn: false};
}
handleLoginClick() {
this.setState({isLoggedIn: true});
}
handleLogoutClick() {
this.setState({isLoggedIn: false});
}
render() {
const isLoggedIn = this.state.isLoggedIn;
let button = null;
if (isLoggedIn) {
button = <LogoutButton onClick={this.handleLogoutClick} />;
} else {
button = <LoginButton onClick={this.handleLoginClick} />;
}
return (
<div>
<Greeting isLoggedIn={isLoggedIn} />
{button}
</div>
);
}
}
ReactDOM.render(
<LoginControl />,
document.getElementById('example')
);
六、與運算發
我們可以通過用花括號包裹代碼在 JSX 中嵌入任何表達式 ,也包括 JavaScript 的邏輯與 &&
,它可以方便地條件渲染一個元素,代碼如下:
<script type="text/babel">
function Mailbox(props) {
const unreadMessages = props.unreadMessages;
return (
<div>
<h2>Hello!</h2>
{unreadMessages.length > 0 &&
<h3>
您有 {unreadMessages.length} 條未讀信息。
</h3>
}
</div>
);
}
const messages = ['React', 'Re: React', 'Re:Re: React'];
ReactDOM.render(
<Mailbox unreadMessages={messages} />,
document.getElementById('example')
);
</script>
而其在 JavaScript 中,true
&& expression
總是返回 expression
,而 false && expression
總是返回 false
。因此,如果條件是 true,&& 右側的元素就會被渲染,如果是 false,React 會忽略并跳過它。
(1)、三目運算符
條件渲染的另一種方法是使用 JavaScript 的條件運算符:導入代碼:
render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
{isLoggedIn ? (
<LogoutButton onClick={this.handleLogoutClick} />
) : (
<LoginButton onClick={this.handleLoginClick} />
)}
</div>
);
}
七、阻止組件渲染
我們在極少數情況下,你可能希望隱藏組件,即使它被其他組件渲染。讓 render 方法返回 null 而不是它的渲染結果即可實現。那么現在我們來看看在下面的例子中,<WarningBanner />
根據屬性 warn
的值條件渲染。如果 warn
的值是 false
,則組件不會渲染帶代碼如下:
function WarningBanner(props) {
if (!props.warn) {
return null;
}
return (
<div className="warning">
警告!
</div>
);
}
class Page extends React.Component {
constructor(props) {
super(props);
this.state = {showWarning: true}
this.handleToggleClick = this.handleToggleClick.bind(this);
}
handleToggleClick() {
this.setState(prevState => ({
showWarning: !prevState.showWarning
}));
}
render() {
return (
<div>
<WarningBanner warn={this.state.showWarning} />
<button onClick={this.handleToggleClick}>
{this.state.showWarning ? '隱藏' : '顯示'}
</button>
</div>
);
}
}
ReactDOM.render(
<Page />,
document.getElementById('example')
);
在代碼中我,我們可以看到組件的 render 方法返回 null 并不會影響該組件生命周期方法的回調。例如,componentWillUpdate
和 componentDidUpdate
依然可以被調用。
八、列表
創建類別通過JavaScript的map()方法來進行,代碼如下:
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((numbers) =>
<li>{numbers}</li>
);
ReactDOM.render(
<ul>{listItems}</ul>,
document.getElementById('example')
);
在代碼中可以將以上實例重構成一個組件,組件接收數組參數,每個列表元素分配一個 key
,不然會出現警告 a key should be provided for list items,
意思就是需要包含 key:代碼如下:
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
<li key={number.toString()}>
{number}
</li>
);
return (
<ul>{listItems}</ul>
);
}
const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
<NumberList numbers={numbers} />,
document.getElementById('example')
);
九、keys
對于這個keys來說他在 DOM 中的某些元素被增加或刪除的時候幫助 React 識別哪些元素發生了變化。因此你應當給數組中的每一個元素賦予一個確定的標識。代碼如下:
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
<li key={number.toString()}>
{number}
</li>
);
一個元素的 key 最好是這個元素在列表中擁有的一個獨一無二的字符串。通常,我們使用來自數據的 id
作為元素的 key:代碼如下:
const todoItems = todos.map((todo) =>
<li key={todo.id}>
{todo.text}
</li>
);
然而當元素沒有確定的 id 時,你可以使用他的序列號索引 index
作為 key:代碼如下:
const todoItems = todos.map((todo, index) =>
// 只有在沒有確定的 id 時使用
<li key={index}>
{todo.text}
</li>
);
但是如果元素沒有確定的id,那么他可以是用index作為key,代碼如下:
const todoItems = todos.map((todo, index) =>
// 只有在沒有確定的 id 時使用
<li key={index}>
{todo.text}
</li>
);
如果列表可以重新排序,不建議使用索引來進行排序,因為這會導致渲染變得很慢。
1、元素的key在兄弟之間應該是唯一的。
我們知道在數組元素中使用的 key 在其兄弟之間應該是獨一無二的。然而,它們不需要是全局唯一的。當我們生成兩個不同的數組時,我們可以使用相同的鍵,代碼如下:
function Blog(props) {
const sidebar = (
<ul>
{props.posts.map((post) =>
<li key={post.id}>
{post.title}
</li>
)}
</ul>
);
const content = props.posts.map((post) =>
<div key={post.id}>
<h4>{post.title}</h4>
<p>{post.content}</p>
</div>
);
return (
<div>
{sidebar}
<hr />
{content}
</div>
);
}
const posts = [
{id: 1, title: 'Hello World', content: 'Welcome to learning React!'},
{id: 2, title: 'Installation', content: 'You can install React from npm.'}
];
ReactDOM.render(
<Blog posts={posts} />,
document.getElementById('example')
);
當然了,key 也會作為給 React 的提示,但不會傳遞給你的組件。如果您的組件中需要使用和 key 相同的值,請將其作為屬性傳遞:
代碼如下:
const content = posts.map((post) =>
<Post
key={post.id}
id={post.id}
title={post.title} />
);
2、在js中嵌入map()
我們首先將單獨的listtems
變量并將其包在js
中,代碼如下:
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
<ListItem key={number.toString()}
value={number} />
);
return (
<ul>
{listItems}
</ul>
);
}
JSX 允許在大括號中嵌入任何表達式,所以我們可以在 map()
中這樣使用,代碼如下:
function NumberList(props) {
const numbers = props.numbers;
return (
<ul>
{numbers.map((number) =>
<ListItem key={number.toString()}
value={number} />
)}
</ul>
);
}
讀到這里,這篇“react基礎語法使用實例分析”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。