/* * @Description: react基础语法集锦,每天了解一点点 * @Version: 2.0 * @Autor: lhl * @Date: 2020-06-01 10:20:33 * @LastEditors: lhl * @LastEditTime: 2020-06-01 11:47:26 */
// props和state的不同?props 是传递给组件的(类似于函数的形参),而 state 是在组件内被组件自己管理的(类似于在一个函数内声明的变量)
import React, { Component } from 'react' import _ from 'lodash'; export default class App extends Component { render() { return ( <div>
<p>hello react</p>
<Foo></Foo>
<Bar></Bar>
<LoadMore></LoadMore>
<Searchbox></Searchbox>
</div>
) } } class Foo extends Component { // 点击事件
// 在 render 方法中使用 Function.prototype.bind 会在每次组件渲染时创建一个新的函数,可能会影响性能
// 在 render 方法中使用箭头函数也会在每次组件渲染时创建一个新的函数,这会破坏基于恒等比较的性能优化。
// 函数传递参数的方式一
handleClick(id) { console.log('Click callback render箭头函数',id,this); // 输出 Click callback render箭头函数 1 和 组件实例
} render() { return ( <div>
<button onClick={() => this.handleClick(1)}>Click Foo</button>
</div>
) } } class Bar extends Component { // 点击事件
// 为什么我的函数每次组件渲染时都会被调用? 正确做法是,传递函数本身(不带括号)
// 函数传递参数的方式二
handleClick(name){ console.log('Click callback',name,this); // 输出 Click callback 'bob' 和 组件实例
} // react 通过 data-attributes 传递参数
handleClickGetAttributes = (e) =>{ console.log(e.target.dataset.id,e.target.dataset.url) // 1 https//www.baidu.com
} render() { return ( <div>
<p data-id="1" data-url="https//www.baidu.com" onClick={this.handleClickGetAttributes}>react获取自定义属性</p>
<button onClick={this.handleClick.bind(this,'bob')}>Click Bar</button>
</div>
) } } // 怎样阻止函数被调用太快或者太多次? 节流 防抖 lodash库提供了节流和防抖的函数 npm i lodash -S 安装
class LoadMore extends React.Component { constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); this.handleClickThrottled = _.throttle(this.handleClick, 1000); } // _.debounce、_.throttle 和 raf-schd 都提供了一个 cancel 方法来取消延迟回调。你需要在 componentWillUnmount 中调用该方法,或者对代码进行检查来保证在延迟函数有效期间内组件始终挂载
componentWillUnmount() { this.handleClickThrottled.cancel(); } render() { return <button onClick={this.handleClickThrottled}>Load More</button>;
} handleClick() { console.log(111) // 使其每秒钟的只能调用一次
} } // 防抖确保函数不会在上一次被调用之后一定量的时间内被执行。当必须进行一些费时的计算来响应快速派发的事件时(比如鼠标滚动或键盘事件时),防抖是非常有用的
class Searchbox extends React.Component { constructor(props) { super(props); this.handleChange = this.handleChange.bind(this); this.emitDebounced = _.debounce(this.emitChange, 1000); } componentWillUnmount() { this.emitDebounced.cancel(); } render() { return ( <input type="text" onChange={this.handleChange} placeholder="Search..." defaultValue={this.props.value} />
); } handleChange(e) { this.emitDebounced(e.target.value); } emitChange(value) { console.log(value,'value') // 1s 的延迟来改变文本输入
} }