本文小编为大家详细介绍“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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。