<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
//1. JSX 允许将 HTML 标签直接放入 JavaScript 代码中 前提是标注 <script type="text/babel">
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
</script>
</body>
</html>
<div id="example"></div>
<script type="text/babel">
//2. 您也可以在 JSX 中使用 JavaScript。它以尖括号 (<) 作为 HTML 语法的开头,以大括号 ( {) 作为 JavaScript 语法的开头。
var names = ['Alice', 'Emily', 'Kate','zqy'];
ReactDOM.render(
<div>
{
names.map(function (name, index) {
return <div class={index} key={index}>Hello, {name}!</div>
})
}
</div>,
document.getElementById('example')
);
</script>
<div id="example"></div>
<script type="text/babel">
//3. 如果 JavaScript 变量是数组,则 JSX 将隐式连接数组的所有成员。
var arr = [
<h1 key="1">Hello world!</h1>,
<h2 key="2">React is awesome</h2>,
];
ReactDOM.render(
<div>{arr}</div>,
document.getElementById('example')
);
</script>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
//4. class ComponentName extends React.Component 创建一个组件类,它实现了一个 render 方法来返回该类的一个组件实例。
//请记住组件名称的第一个字母必须大写,否则 React 会抛出错误。例如,HelloMessage作为组件的名称是可以的,但helloMessage不允许。一个 React 组件应该只有一个顶级子节点。
class HelloMessage extends React.Component {
render() {
return <h1>Hello {this.props.name}</h1>;
}
}
ReactDOM.render(
<HelloMessage name="John" />,
document.getElementById('example')
);
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
//5. React 用于this.props.children访问组件的子节点。
//class Note注意, 的值this.props.children具有三种可能性。如果组件没有子节点,则值为undefined; 如果单个子节点,一个对象;如果有多个子节点,则为一个数组。你应该小心处理它。
//React 为我们提供React.Children了处理this.props.children不透明数据结构的实用程序。您可以使用React.Children.map来进行迭代,this.props.children而不必担心其数据类型是undefined或object。
class NotesList extends React.Component {
render() {
return (
<ol>
{
React.Children.map(this.props.children, function (child) {
return <li>{child}</li>;
})
}
</ol>
);
}
}
ReactDOM.render(
<NotesList>
<span>hello</span>
<span>world</span>
</NotesList>,
document.getElementById('example')
);
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
<script src="../build/prop-types.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
//6. PropTypes 组件参数验证
//更多参数请参考
//https://reactjs.org/docs/typechecking-with-proptypes.html
var data = '123';
class MyTitle extends React.Component {
static propTypes = {
title: PropTypes.string.isRequired,
}
render() {
return <h1> {this.props.title} </h1>;
}
}
ReactDOM.render(
<MyTitle title={data}/>,
document.getElementById('example')
);
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
<!-- https://reactjs.org/docs/refs-and-the-dom.html#callback-refs -->
<script type="text/babel">
//7 . React.createRef() ??
//有时您需要在组件中引用 DOM 节点。React 为您提供了ref将 DOM 节点附加到由React.createRef().
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myTextInput = React.createRef();
this.handleClick = this.handleClick.bind(this)
}
handleClick() {
console.log(1)
this.myTextInput.current.focus();
}
render() {
return (
<div>
<input type="text" ref={this.myTextInput} />
<input type="button" value="Focus the text input" onClick={this.handleClick} />
</div>
);
}
}
ReactDOM.render(
<MyComponent />,
document.getElementById('example')
);
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
//8. React 将组件视为状态机,并用于this.state保存组件的状态,this.setState()更新this.state和重新渲染组件。
class LikeButton extends React.Component {
constructor(props) {
super(props)
this.state = {
liked: false
}
this.handleClick = this.handleClick.bind(this)
}
handleClick(event) {
this.setState({ liked: !this.state.liked });
}
render() {
var text = this.state.liked ? 'like' : 'haven\'t liked';
return (
<p onClick={this.handleClick}>
You {text} this. Click to toggle.
</p>
);
}
}
ReactDOM.render(
<LikeButton />,
document.getElementById('example')
);
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
//9. 双向绑定
//根据 React 的设计理念,this.state描述组件的状态并通过用户交互进行变异,this.props描述组件的属性并且是稳定不可变的。
因此,valueForm 组件的属性,例如 <input>、<textarea> 和 <option>,不受任何用户输入的影响。如果您想访问或更新值以响应用户输入,您可以使用 onChange 事件。
class Input extends React.Component {
constructor(props) {
super(props)
this.state = {
value: 'Hello!'
}
this.handleChange = this.handleChange.bind(this)
}
handleChange(event) {
this.setState({ value: event.target.value });
}
render() {
var value = this.state.value;
return (
<div>
<input type="text" value={value} onChange={this.handleChange} />
<p>{value}</p>
</div>
);
}
}
ReactDOM.render(<Input/>, document.getElementById('example'));
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
//10. 组件的生命周期分为三个主要部分:Mounting(插入到 DOM 中)、Updating(重新渲染)和 Unmounting(从 DOM 中移除)。React 为这些生命周期部分提供了钩子。will方法在某事发生之前被调用,did方法在某事发生之后被立即调用。
class Hello extends React.Component {
constructor(props) {
super(props)
this.state = {
opacity: 1.0
};
}
//在初始渲染发生后触发一次
componentDidMount() {
this.timer = setInterval(function () {
var opacity = this.state.opacity;
opacity -= .05;
if (opacity < 0.1) {
opacity = 1.0;
}
this.setState({
opacity: opacity
});
}.bind(this), 100);
}
render() {
return (
<div style={{opacity: this.state.opacity}}>
Hello {this.props.name}
</div>
);
}
}
ReactDOM.render(
<Hello name="world"/>,
document.getElementById('example')
);
</script>
</body>
</html>
componentWillMount():在初始渲染发生之前触发一次。连接消息侦听器的好地方。this.setState在这里不起作用。
componentDidMount():在初始渲染发生后触发一次。可以使用this.getDOMNode()。
componentWillUpdate(object nextProps, object nextState):在组件对 DOM 进行更新后触发。可this.getDOMNode()用于更新。
componentDidUpdate(object prevProps, object prevState):在组件的更新刷新到 DOM 后立即调用。初始渲染不会调用此方法。以此为契机,在组件更新后对 DOM 进行操作。
componentWillUnmount():在从 DOM 卸载组件之前立即触发。删除消息侦听器或一般清理的好地方。
componentWillReceiveProps(object nextProps):当组件接收新道具时触发。你可能想this.setState根据道具。
shouldComponentUpdate(object nextProps, object nextState):当接收到新的道具或状态时,在渲染之前触发。return false如果您知道不需要更新。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
<script src="../build/jquery.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
//11.如何从服务器或 API 提供者获取组件的数据?答案是使用 Ajax 在componentDidMount. 当服务器响应到达时,存储数据this.setState()以触发 UI 的重新呈现。
class UserGist extends React.Component {
constructor(props) {
super(props)
this.state = {
username: '',
lastGistUrl: ''
}
}
componentDidMount() {
$.get(this.props.source, function(result) {
console.log(result,"result");
var lastGist = result[0];
this.setState({
username: lastGist.owner.login,
lastGistUrl: lastGist.html_url
});
}.bind(this));
}
render() {
return (
<div>
{this.state.username}'s last gist is <a href={this.state.lastGistUrl}>here</a>.
</div>
);
}
}
ReactDOM.render(
<UserGist source="https://api.github.com/users/octocat/gists" />,
document.getElementById('example')
);
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="../build/react.development.js"></script>
<script src="../build/react-dom.development.js"></script>
<script src="../build/babel.min.js"></script>
<script src="../build/jquery.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
//12. 异步请求
class RepoList extends React.Component {
constructor(props) {
super(props)
this.state = {
loading: true,
error: null,
data: null
};
}
componentDidMount() {
this.props.promise.then(
value => this.setState({loading: false, data: value}),
error => this.setState({loading: false, error: error}));
}
render() {
if (this.state.loading) {
return <span>Loading...</span>;
}
else if (this.state.error !== null) {
return <span>Error: {this.state.error.message}</span>;
}
else {
var repos = this.state.data.items;
var repoList = repos.map(function (repo, index) {
return (
<li key={index}><a href={repo.html_url}>{repo.name}</a> ({repo.stargazers_count} stars) <br/> {repo.description}</li>
);
});
return (
<main>
<h1>Most Popular JavaScript Projects in Github</h1>
<ol>{repoList}</ol>
</main>
);
}
}
}
ReactDOM.render(
<RepoList promise={$.getJSON('https://api.github.com/search/repositories?q=javascript&sort=stars')} />,
document.getElementById('example')
);
</script>
</body>
</html>