讲讲我学习 React 遇到的那些坑 vol.1

也欢迎来看我的 Vue.js 系列:

总体来说

和 Vue 整体差别蛮大的。

  • 数据单向(虽然是可以做成双向,但我觉得这应该不是React设计初衷)
  • HTML和方法边界模糊
  • 不需要在一种特定的模板下去写逻辑 (比如说vue取值需要放在data里面)

数据更新

refs: https://legacy.reactjs.org/docs/state-and-lifecycle.html
tips: 好像已经过时了, 在后续的文章中会介绍更好的写法

想要数据在页面上可以更新,还是需要依靠state的。

class Clock extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            // step1. 定义变量,date 变量
            date: new Date()
        };
    }

    // step2. 更新值的方法
    tick() {
        this.setState({
            date: new Date()
        });
    }
    
    // step3. render 到页面上
    render() {
        return (
            <div>
                <h1>Hello, world!</h1>
                <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
            </div>
        );
    }
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Clock />);

类双向绑定

可以通过 state 来更新页面渲染的内容,那么组件上输入的内容要怎么更新数据呢。

Responding Event

e.g:

// onClick
function Button({ onSmash, children }) {
  return (
    <button onClick={onSmash}>
      {children}
    </button>
  );
}

// onSmash
<div>
    <Button onSmash={() => alert('Playing!')}>
        Play Movie
    </Button>
</div>

// onSubmit
<form onSubmit={e => {
    e.preventDefault();
    alert('Submitting!');
}}>

// onChange
<Input type='text' placeholder='Original Body' onChange={this.handleBodyChange.bind(this)} value={this.state.model.body} />
handleBodyChange(event: any) {
    // 获取输入框值
    let body = event.target.value
    this.setState({
    body: body
    })
}

Refs