含面试题:生命周期,钩子函数,prosp,state状态机,挂载卸载,父子组件【诗书画唱】

作业
1、定义一个标签,创建一个cat对象,包含name,age和color,定义一个组件显示这只猫的所有属性值。
2、创建一个商品数组,通过table和<tr>显示这个数组中的所有商品信息。
3、创建一个科目数组,包含科目和成绩属性,通过父子组件<ul>和<li>标签显示其中的内容
4、将全班同学的名字放到一个数组中,设计一个组件,依次显示这些同学的姓名,当显示到最后一个同学以后再次从第一个同学开始显示
5、下拉框默认选中
6、商品列表
视频学习记录
super()调用父类的构造方法,this.state就是状态机
state,状态机
挂载和卸载
生命周期函数(钩子函数)
计算器代码执行顺序
面试题等等常考查内容:箭头函数内部的this和外部函数的this指向同一个对象
ReactJS componentWillUnmount()用法及代码示例
生命周期函数也叫钩子函数
讲义:

一、自定义组件的三种方法
二、设置组件属性的默认值
三、单选框和多选框的默认选中设置
四、下拉框
五、...扩展运算符
Reactjs的组件:将一系列的Html或者组件封装成一个自定义的标签
<ul><li>语文</li><li>数学</li><li>英语</li></ul>
<MyLabel abc="[语文,数学,英语]"/>
组件的属性:在组件内部通过this关键字可以点出来的属性
props:props对象中的所有的属性是不能够被修改的
state:状态机
children
ref
mount:挂载
生命周期方法(钩子函数)
props属性处理数组.html
扩展操作符.html
通过计数器学习state.html
组件的props属性.html
组件属性的默认值.html

作业
1、定义一个标签,创建一个cat对象,包含name,age和color,定义一个组件显示这只猫的所有属性值。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<script type="text/babel">
let cat = {
name: '诗书画唱家的神猫',
age: 666,
color:"黄色"
};
class ShowAllValue extends React.Component{
render(){
return <b>
{this.props.name} {this.props.age} {this.props.color}
</b>;
}
}
ReactDOM.render(<ShowAllValue {...cat} />,
document.getElementById('id1'));
</script>
</head>
<body>
<div id="id1"></div>
</body>
</html>


2、创建一个商品数组,通过table和<tr>显示这个数组中的所有商品信息。


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<script type="text/babel">
//方法一:使用父子组件来渲染
//子组件:
class TrZuJian extends React.Component{
render(){
return <tr >
<td>{this.props.name}</td>
<td>{this.props.price}</td>
</tr>;
}
}
//父组件:
class TableZuJian extends React.Component{
render(){
const arr =[{name:'诗书画唱牌商品1',price:666},{name:'诗书画唱牌商品2',price:888}];
let Newdata= arr.map(o => (<TrZuJian key={o.name} name={o.name} price={o.price} />));
return <table border="1px"><tbody>{Newdata}</tbody></table>
}
}
ReactDOM.render(<TableZuJian />,document.getElementById('id1'));
//方法二:使用一个组件来渲染
class TableZuJian2 extends React.Component{
render(){
const arr =[{name:'诗书画唱牌商品1',price:666},{name:'诗书画唱牌商品2',price:888}];
let Newdata= arr.map(o =>
(<tr >
<td>{o.name}</td>
<td>{o.price}</td>
</tr>));
return <table border="1px"><tbody>{Newdata}</tbody></table>
}
}
ReactDOM.render(<TableZuJian2 />,document.getElementById('id2'));
</script>
</head>
<body>
方法一:使用父子组件来渲染
<div id="id1"></div>
<br />
方法二:使用一个组件来渲染
<div id="id2"></div>
</body>
</html>


3、创建一个科目数组,包含科目和成绩属性,通过父子组件<ul>和<li>标签显示其中的内容

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<script type="text/babel">
//单词:score(得分) subject(科目)
//使用父子组件来渲染:
//子组件:
class LiZuJian extends React.Component{
render(){
return <li>{this.props.subject} {this.props.score}</li>
;
}
}
//父组件:
class UlZuJian extends React.Component{
render(){
const arr =[{subject:'诗书画唱牌商品1',score:666},{subject:'诗书画唱牌商品2',score:888}];
let Newdata= arr.map(o => (<LiZuJian key={o.subject} subject={o.subject} score={o.score} />));
return <ul>{Newdata}</ul>
}
}
ReactDOM.render(<UlZuJian />,document.getElementById('id1'));
</script>
</head>
<body>
<div id="id1"></div>
</body>
</html>


4、将全班同学的名字放到一个数组中,设计一个组件,依次显示这些同学的姓名,当显示到最后一个同学以后再次从第一个同学开始显示

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<script type="text/babel">
class ZuJian extends React.Component{
//constructor是组件的构造方法:
constructor(){
//super可以调用父类的构造方法:
super();
//用this.state添加一个状态:
this.state = {
num:0,
arr: ["诗书画唱","三连","点赞","投币","关注"]
};
}
//生命周期函数也叫钩子函数。
//当组件挂载以后调用这个函数:
componentDidMount(){
//箭头函数内部的this和外部函数的this指向同一个对象:
this.iv = setInterval(() => {
//必须调用setState方法才能使组件刷新:
this.setState({
/*这里的this.state.arr.length-1用上random生成0到数组长度减1的随机数后,
就实现了随机点名器,界面自己可以再设计,美化:*/
num: this.state.num==this.state.arr.length-1?this.state.num=0:++ this.state.num
});
},1000);
}
//当组件被卸载时调用:
componentWillUnmount(){
//同时清除setInterval函数:
//如果this.iv有值时执行clearInterval(this.iv);
if(this.iv) {
clearInterval(this.iv);
}
}
render(){
return (<div>
<h1>显示的名字:</h1>
<h2>{this.state.num} {this.state.arr[this.state.num]}</h2>
</div>);
}
}
//通过ReactDOM.render的<ZuJian />来挂载ZuJian这个组件后会自动执行componentDidMount中的内容:
ReactDOM.render(<ZuJian />,
document.getElementById('app'));
</script>
</head>
<body>
<div id="app"></div>
</body>
</html>



5、下拉框默认选中

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
</head>
<body>
<div id="myDiv"></div>
<!--<select >
<option value="1">点赞</option>
<option value="2">收藏</option>
</select>-->
<script type="text/babel">
//1、下拉框默认选中
class MyOption extends React.Component{
constructor(props){
super(props);
}
render() {
return <option value={this.props.cid} selected={this.props.selected} >{this.props.cname}</option>
}
}
class MySel extends React.Component{
constructor(props){
super(props);
}
render() {
const cityArr = [{id:1,name:'长沙'},{id:2,name:'湘潭'},{id:3,name:'株洲'}];
//补全代码:设置湘潭为默认选中
const cityItems =cityArr.map(o =>(
o.id==2?<MyOption key={o.id}
cname={o.name} cid={o.id} selected="selected" /> :
<MyOption key={o.id}
cname={o.name} cid={o.id} />
) );
return (<select >{cityItems}</select>);
}
}
ReactDOM.render(< MySel />,document.getElementById('myDiv'));
// MyOption.defaultProps = {
// selected:"selected";
// };
// selected="selected"
//cityArr[1].push="selected";
//document.getElementsByTagName("option")[1];
//console.log(document.getElementsByTagName("option")[0])
//console.log(<select >{cityItems}</select>)
// console.log(<MyOption/> )
//var a=document.getElementsByTagName("option");
//console.log( [...a]);
//console.log(document.getElementById('湘潭'))
</script>
</body>
</html>


6、商品列表

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<style>
img{width: 100px;height: 100px;}
</style>
</head>
<body>
<div id="myDiv"></div>
<script type="text/babel">
//2、商品列表
class MyTr extends React.Component{
constructor(props){
super(props);
}
render() {
return (<tr>
<td>{this.props.pname}</td>
<td>{this.props.price}</td>
<td><img src={this.props.src} /></td>
</tr>);
}
}
class MyTab extends React.Component{
constructor(props){
super(props);
}
render() {
const proData = {"total":3,"rows":[
{pname:'爆米花',price:20.0,src:'1.png'},
{pname:'辣条',price:4.9,src:'2.png'},
{pname:'薯片',price:15.0,src:'3.png'}]}
//补全代码
return (<table border="1px">{proData.rows.map(o => (< MyTr key={o.pname}
pname={o.pname} price={o.price} src={o.src} /> ))}</table>);
}
}
ReactDOM.render(<MyTab />,document.getElementById('myDiv'));
</script>
</body>
</html>


视频学习记录

props是object普通对象的类型。




super()调用父类的构造方法,this.state就是状态机。





计算器代码执行顺序

面试题等等常考查内容:箭头函数内部的this和外部函数的this指向同一个对象

ReactJS componentWillUnmount()用法及代码示例

生命周期函数也叫钩子函数


props属性处理数组.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<script type="text/babel">
//自定义的选项组件
class Item extends React.Component{
render(){
return <option>{this.props.cname}</option>;
}
}
//自定义的下拉框组件
class Sel extends React.Component{
render(){
const arr = ['长沙','株洲','湘潭'];
let items = [];
for(let i = 0;i < arr.length;i ++) {
let cn = arr[i];
let e = <Item cname={cn} />;
items[i] = e;
}
// let items = arr.map(cn => <Item key={cn} cname={cn} />);
return <select >{items}</select>;
}
}
ReactDOM.render(<Sel />,document.getElementById('app'));
</script>
</head>
<body>
<div id="app"></div>
</body>
</html>


扩展操作符.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<script type="text/babel">
class Product extends React.Component{
render(){
return <a href="#">
{this.props.id}{this.props.pname}:{this.props.price}/{this.props.unit}
</a>;
}
}
let pro = {
pname: '德芙巧克力',
price: 8.5,
id: 4,
unit: '块'
};
//ReactDOM.render(<Product pname="德芙巧克力" price="8.5" id="4" />,
ReactDOM.render(<Product {...pro} />,
document.getElementById('app'));
</script>
</head>
<body>
<div id="app"></div>
</body>
</html>


通过计数器学习state.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<script type="text/babel">
class Counter extends React.Component{
//组件的构造方法
constructor(){
//调用父类的构造方法
super();
//添加一个状态
this.state = {
num: 0
};
}
//生命周期函数(钩子函数)
//当组件挂载以后调用这个函数
componentDidMount(){
//console.log(this);//当前组件
// let that = this;
// this.iv = setInterval(function(){
// //console.log(this);//window
// //必须调用setState方法才能使组件刷新
// that.setState({
// num: ++ that.state.num
// });
// },1000);
//箭头函数内部的this和外部函数的this指向同一个对象
this.iv = setInterval(() => {
this.setState({
num: ++ this.state.num
});
},1000);
}
//当组件被卸载时调用
componentWillUnmount(){
//同时清除setInterval函数
if(this.iv) {
clearInterval(this.iv);
}
}
render(){
return (<div>
<h1>计数器组件</h1>
<h2>{this.state.num}</h2>
</div>);
}
}
ReactDOM.render(<Counter />,
document.getElementById('app'));
</script>
</head>
<body>
<div id="app"></div>
</body>
</html>

组件的props属性.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<script type="text/babel">
//给自定义的标签中添加自定义的属性
//方法一:
// function Stu(props){
// return <h1>姓名是:{props.name},年龄是:{props.age},性别是:{props.sex}</h1>;
// }
//方法二:
class Stu extends React.Component{
render(){
//this.props中的props属性不能够改
return <h1>姓名是:{this.props.name},年龄是:{this.props.age},性别是:{this.props.sex}</h1>;
}
}
ReactDOM.render(<Stu name="Kite" age="18" sex="女" />,
document.getElementById('app'));
</script>
</head>
<body>
<div id="app"></div>
</body>
</html>


组件属性的默认值.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" srcc="js/react.js" ></script>
<script type="text/javascript" srcc="js/react-dom.js" ></script>
<script type="text/javascript" srcc="js/browser.js" ></script>
<script type="text/babel">
class Address extends React.Component{
render(){
//this.props中的所有的属性是不能够修改的
//this.props.prov = '广东';//报错
return <h1>收货地址:{this.props.prov}省{this.props.city}市</h1>;
}
}
//给Address组件的prov和city属性设置默认值
Address.defaultProps = {
prov: '江西',
city: '宜春'
};
ReactDOM.render(<Address prov="湖北" city="武汉" />,
document.getElementById('app'));
</script>
</head>
<body>
<div id="app"></div>
</body>
</html>

