一:jsx语法细节补充
- 定义css的类的时候,不能用
class
,要用className
来代替class
这个关键词,因为我们用class
已经声明类了,这样会重复定义。 - 注释的话用
{/*我是注释*/}
- 点击
label
获取input
的光标,可以在input上定义一个id,比如这个id是insertArea,那么在label中加htmlFor
。代替之前的for
关键字。 - 在
import React, { Component }
,这里的{ Component}
是结构赋值。
二:拆分组件与组件之间的传值
组件化思维
react是树形的结构,这里todoList是大组件,todoItem是todoList下的小组件。
父组件向字组件传递数据用属性才进行传递,通过标签属性传递(属性和方法)过去之后,子组件用this.props.*
来进行接收。
子组件如何调用父组件的方法,并改变里面的数据?把父组件的方法传给子组件即可。用this.props.*
,父组件如果传递方法,需要做一次绑定。
要不然会出现下面的错误:
TypeError: Cannot read property 'list' of undefined
三:优化todoList
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import TodoList from './TodoList';
ReactDOM.render(<TodoList />, document.getElementById('root'));
//TodoList.js
import React, { Component, Fragment } from 'react';
import TodoItem from './TodoItem';
class TodoList extends Component {
constructor(props) {
super(props)
this.state = {
inputValue: '',
list: []
}
this.handleInputChange = this.handleInputChange.bind(this);
this.handleBtnClick = this.handleBtnClick.bind(this);
this.handleItemDelete = this.handleItemDelete.bind(this);
}
handleInputChange (e) {
const value = e.target.value
this.setState(() => ({
inputValue: value
}))
// old
// this.setState({
// inputValue: e.target.value
// })
}
handleBtnClick() {
//setState有一个参数可以接收以前的数据
this.setState((prevState) => ({
list: [...prevState.list, prevState.inputValue],
inputValue: ''
}))
// old
// this.setState({
// list: [...this.state.list, this.state.inputValue],
// inputValue: ''
// })
}
handleItemDelete (index) {
// immutable
// state 不允许我们做任何改变
this.setState((prevState) => {
const list = [...prevState.list]
list.splice(index, 1);
return {list}
});
}
getTodoItem () {
return this.state.list.map((item, index) => {
return (
<TodoItem
key={index}
content={item}
index={index}
deleteItem={this.handleItemDelete}
/>
)
})
}
render() {
return (
<Fragment>
<div>
<input value={this.state.inputValue} onChange={this.handleInputChange} />
<button onClick={this.handleBtnClick}>提交</button>
</div>
<ul>
{this.getTodoItem()}
</ul>
</Fragment>
)
}
}
export default TodoList; //把自身导出,外部才可以引用。
//TodoItem.js
import React, { Component } from 'react';
class TodoItem extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
const { deleteItem ,index } = this.props
deleteItem(index);
}
render() {
const { content } = this.props
return (
<div onClick={this.handleClick}>
{content}
</div>
)
}
}
export default TodoItem;
四:围绕react衍生出的思考
- 直接操作dom的开发方式是
命令式开发
的方式,比如我们熟悉的jquery
- 而react是
声明式开发
可以与其他框架并存
组件式开发
- react是单向数据流,只允许父组件向子组件传递数据,子组件绝对不能修改父组件传递的数据,而必须要删除的话是子组件调用父组件的方法,然后进行删除,这里实际上也是调用对父组件进行操作,这样只需要维护父组件即可,维护起来比较容易
- react是一个视图层框架,小型项目即可。而大型的需要依赖
Flux
redux
等这样的数据层框架 - 函数式编程,都是一个一个的函数组成,方便于测试,给前端的自动化测试带来很大的便捷性。
以上。
网友评论