React笔记(一)JSX与组件.md

简书迁移

Posted by thrfox on June 29, 2020

定义一个变量

1
  const element = <h1>Hello,world.</h1> 该变量既不是string也不是HTML,而是被称作JSX > JSX is an XML/HTML-like syntax used by React that extends ECMAScript so that XML/HTML-like text can co-exist with JavaScript/React code. JSX我理解为JS语法混合着XML语法 JSX不是React所必须的,但其可以更简便的使UI设计混合在JS语法中

在JSX中可以嵌入任意JS语句

1
2
3
4
5
6
7
8
9
10
function add(x,y){
  return x + y;
}
const element = (
  <h1>加法:{add(3,5)}</h1>
);
ReactDOM.render(
  element,
  document.getElementById('root')
);

组件与props

props可以理解为一个object

1
2
3
4
5
6
7
8
9
10
function Welcome(prop){  //称为组件
  return <h1>Hello,{prop.name}</h1>;
};

const element = <Welcome name='Sara' />;  //此处相当于给Welcome传入String:Sara,组件中用name接到

ReactDOM.render(
  element,
  document.getElementById('root')
);

在以上代码中,分为四步 1.ReactDOM.render渲染element 2.element中发现Welcome作为组件并且带有props对象,该对象可以携带多个参数如String,Date,object等,如该例携带了JSON {name: ‘Sara’} 3.Welcome组件返回结果<h1>Hello, Sara</h1> 4.ReactDOM可以根据’Welcome’的DOM内容即时渲染最新结果

注意: 时刻注意组件名称首字母大写,有一下原因: 1.React识别首字母小写的为DOM标签,如<div />。 2.首字母大写则视为组件,如

在一个复杂的App中提取部分作为组件

以下为需渲染的app
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function Comment(props) {
  return (
    <div className="Comment">
      <div className="UserInfo">
        <img className="Avatar"
          src={props.author.avatarUrl}
          alt={props.author.name}
        />
        <div className="UserInfo-name">
          {props.author.name}
        </div>
      </div>
      <div className="Comment-text">
        {props.text}
      </div>
      <div className="Comment-date">
        {formatDate(props.date)}
      </div>
    </div>
  );
}
提取关键部分为组件后
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function formatDate(date) {
  return date.toLocaleDateString();
}

function Avatar(props) {
  return (
    <img
      className="Avatar"
      src={props.user.avatarUrl}  //此处的props.user为UserInfo传入的user参数,即不用关心Comment最顶层传入的是author
      alt={props.user.name}
    />
  );
}

function UserInfo(props) {
  return (
    <div className="UserInfo">
      <Avatar user={props.user} //此处的props.user即Comment中的props.author;同时再封装成user参数传入至Avatar
        />  
      <div className="UserInfo-name">{props.user.name}</div>
    </div>
  );
}

function Comment(props) {
  return (
    <div className="Comment">
      <UserInfo user={props.author} />
      <div className="Comment-text">{props.text}</div>
      <div className="Comment-date">
        {formatDate(props.date)}
      </div>
    </div>
  );
}

const comment = {
  date: new Date(),
  text: 'I hope you enjoy learning React!',
  author: {
    name: 'Hello Kitty',
    avatarUrl: 'http://placekitten.com/g/64/64',
  },
};
ReactDOM.render(
  <Comment
    //此处的Comment即传入一个带参数的【组件】并进行渲染
    date={comment.date} //传入comment对象下的date对象
    text={comment.text}
    author={comment.author}//传入comment对象下的author对象
  />,
  document.getElementById('root')
);

注意:在React中, 所有的组件中的props都应该为只读的(read-only) 即props对象不应该被组件中的代码所修改,比较以下两个代码

1
2
3
function sum(a, b) {
  return a + b;
}

1
2
3
function withdraw(account, amount) {
  account.total -= amount;
}