1.react 中组件传值都是通过属性传递的 方法也是 。
2.父组件通过属性传给子组件,子组件通过this.props接收。
eg:
import React, { Component } from 'react';
import TodoItem from './todoItem';
// 父组件
export default class todoList extends Component {
constructor(props) {
super(props);
this.state = {
value: '',
list: []
}
}
handleChange = (e) => {
this.setState({
value: e.target.value
})
}
handleBtnClick = () => {
this.setState({
list: [...this.state.list,this.state.value],
value: ''
})
}
handleItemDelete = (index) => {
const list = [...this.state.list];
list.splice(index,1);
this.setState({
list: list
})
}
render() {
return (
<div>
<input type="text" value={this.state.value} onChange={this.handleChange}/>
<button onClick={this.handleBtnClick}>提交</button>
<ul>
{
this.state.list.map((item,index) => (
<div>
<TodoItem
// 属性传递值
content={item}
index={index}
/// 属性传递方法
ItemDelete = {this.handleItemDelete}
/>
</div>
))
}
</ul>
</div>
)
}
}
2.子组件
import React, { Component } from 'react'
// 子组件
export default class todoItem extends Component {
handleClick = () => {
// prop接受属性和方法
this.props.ItemDelete(this.props.index);
}
render() {
return (
<div onClick={this.handleClick}>
{this.props.content}
</div>
)
}
}
不同阶段生命周期函数执行顺序
挂载是指组件被实例化并且被插入dom中
constructor --> getDerivedStateFromProps – > render --> compomentDidMount
当state 或 props 变化时触发
顺序如下:
getDerivedStateFromProps --> shouldComponentUpdate --> render --> getSnapshotBeforeUpdate --> componentDidUpdate
卸载是指组件被移除
componentWillUnmount
生命周期查看地址: react16.3 and react16.4 详细生命周期图例
1.函数组件(无状态组件) vs 类组件
action -> dispatch(action) -> store -> reducer(是一个函数) -> new State -> store
createStore 创建store。
store.getState() 获取store中的数据。
store.dispatch(action): 派发action 更新store的数据。
store.subscribe(): 订阅store中的数据。(subscribe 参数是一个函数)
react 要改变store数据 要派发action action 通过dispatch方法传递给store store会把之前的数据和action 转发给reducer reducer是一个函数 reducer接受到了state和action之后 做一些处理后返回给store store会替换之前的数据, store 数据发生改变后 组件会感知到组件发生改变, 这个时候它从store 中重新取数据更新组件的内容,随之页面跟着发生变化了。
1.把异步代码放到了acton中操作。
2.redux-thunk :对store.dispatch()的升级让他可以接受一个函数。
3.redux-thunk 指的是redux的中间件。
// app.js
componentDidMount() {
const action = getTodoList(); // 是一个函数
store.dispatch(action);
}
// actionCreators.js
import { INIT_LIST_ACTION, GET_INIT_LIST } from './actionTypes';
import axios from 'axios';
export const initListAction = (data) => ({
type: INIT_LIST_ACTION,
data
});
export const getTodoList = () => {
return (dispatch) => {
// redux-thunk 让 action 是一个函数
axios.get('https://tapi.lifeat.cn:45788/city/provinces').then(res => {
const data = res.data.data;
const action = initListAction(data); // 这个时候action是一个对象了 再派发给sotre
dispatch(action);
})
}
}
1.provider 高阶组件
import React from 'react';
import ReactDOM from 'react-dom';
import store from './store';
import './index.css';
import App from './App'
import { Provider } from 'react-redux';
// provider 把store 提供给组件
const Apps = (
<Provider store={store}>
<App />
</Provider>
)
ReactDOM.render(Apps, document.getElementById('root'));
2.connect 高阶组件
import React from 'react';
import { connect } from 'react-redux';
class App extends React.Component {
handleChange(e) {
console.log(e.target.value);
}
handleClick = () => {
}
render() {
return (
<div className="App">
<input type="text" onChange={e => this.props.changeInputValue(e)} value={this.props.input}/><button onClick={this.handleClick}>提交</button>
</div>
);
}
}
//mapStateToProps 把store的state数据映射props , mapDispatchToProps 把dispatch映射给props
// state的数据映射给props
const mapStateToProps = (state) => {
console.log(state)
return {
input: state.input
}
}
// store.dispatch 映射到props 上
const mapDispatchToProps = (dispatch) => {
return {
changeInputValue(e) {
dispatch({type: 'change_input_value',value: e.target.value})
}
}
}
export default connect(mapStateToProps,mapDispatchToProps)(App);
欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
一个具有注脚的文本。2
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
我们依旧会支持flowchart的流程图:
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
mermaid语法说明 ↩︎
注脚的解释 ↩︎