萌新react第一步:基础使用

写在开头

// vscode React 模块快捷创建
// 左上角文件->首选项->用户片段
{
	"Snippet Name": {
		"prefix": "myReact", // 触发片段的快捷键
		"body": [
			"import React, { $1 } from 'react'",
			"",
			"class $2 extends ${1} {",
			" render(){",
			"   return (",
			"		<div>"
			"     $3$0",
			"		</div>"
			"   )",
			" }",
			"}",
			"",
			"export default ${2:MyComponent}"
		],
		"description": "Create Basic Component"
	},
	"Constructor": {
		"prefix": 'ctr',
		"body": [
			"constructor() {",
			"	super()",
			"}"
		]
	}
}

state

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello React!</title>
  <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
  <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
  <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>

<body>
  <div id="demo"></div>
  <script type="text/babel">
    // 1.定义组件
    class Like extends React.Component {
      constructor(props) {
        super(props)
        // 初始化state
        this.state = {
          isLike: false
        }
      }

      // 新添加方法:内部的this默认不是组件对象,而是undefined
      handleClick = () =>{
        // 得到状态
        const isLike = !this.state.isLike
        // 更新状态
        this.setState({isLike})
      }

      // 重写组件类的方法
      render() {
        // 读取状态
        const { isLike } = this.state
        return <h2 onClick={this.handleClick}>{isLike ? 'kirito' : 'asuna'} </h2>
      }
    }
    // 2.渲染组件标签
    ReactDOM.render( < Like/ > , document.getElementById('demo'))
  </script>
</body>
</html>
var foo = 'bar';

props

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello React!</title>
  <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
  <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
  <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
  <script src="https://unpkg.com/[email protected]/prop-types.js"></script>
</head>

<body>
  <div id="demo"></div>
  <div id="demo2"></div>
  <script type="text/babel">
    // 1.定义组件
    // function Persion(props) {
    //   return (
    //     <ul>
    //       <li>姓名: {props.name}</li>
    //       <li>年龄: {props.age}</li>
    //       <li>性别: {props.sex}</li>  
    //     </ul>
    //   )
    // }

    class Persion extends React.Component{
      render(){
        return (
          <ul>
            <li>姓名: {this.props.name}</li>
            <li>年龄: {this.props.age}</li>
            <li>性别: {this.props.sex}</li>  
          </ul>
        )
      }
    }
    // 指定属性默认值
    Persion.defaultProps = {
      sex: '女',
      age: 15
    }
    // 指定属性类型和必要性
    Persion.propTypes = {
      name: PropTypes.string.isRequired,
      age: PropTypes.number
    }

    // 2.渲染组件标签
    const p1 = {
      name:'kirito',
      age:16,
      sex: '男'
    }
    // ReactDOM.render( < Persion name={p1.name} age={p1.age} sex={p1.sex}></ Persion> , document.getElementById('demo'))
    ReactDOM.render( < Persion {...p1}></ Persion> , document.getElementById('demo'))
    const p2 = {
      name:'asuna',
    }
    ReactDOM.render( < Persion name={p2.name}></ Persion> , document.getElementById('demo2'))
  </script>
</body>
</html>

定义组件

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello React!</title>
  <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
  <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
  <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
  <script src="https://unpkg.com/[email protected]/prop-types.js"></script>
</head>

<body>
  <div id="demo"></div>
  <script type="text/babel">
    // 定义组件
    class MyComponent extends React.Component{
      constructor(props){
        super(props)
      }
      showInput = () => {
        const input = this.refs.content
        // alert(input.value)
        alert(this.input.value)
      }
      handleBlur = (event) =>{
        alert(event.target.value)
      }
      render(){
        return (
          <div>
            <input ref="content" type="text"/>&nbsp;
            <input ref={input=>this.input = input} type="text"/>&nbsp;
            <button onClick={this.showInput}>提示输入数量</button>&nbsp;
            <input type="text" placeholder="失去焦点提示数据" onBlur={this.handleBlur}/>  
          </div>
        )
      }
    }
    // 2.渲染组件标签
    ReactDOM.render( < MyComponent></ MyComponent> , document.getElementById('demo'))
  </script>
</body>
</html>

组件组合使用

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello React!</title>
  <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
  <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
  <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
  <script src="https://unpkg.com/[email protected]/prop-types.js"></script>
</head>

<body>
  <div id="demo"></div>
  <script type="text/babel">
    /*
      如果所有子组件都需要,数据保存在最外层组件中
      如果只有某个组件需要,放在对应组件中
      子组件中不能直接改变父组件的状态
      状态在哪个组件,更新状态的行为就应该定义在哪个组件
    */
    class App extends React.Component{
      constructor(props){
        super(props)
        // 初始化
        this.state = {
          todos: ['吃饭','睡觉','锻炼']
        }
      }
      addTodo = (todo) => {
        const {todos} = this.state
        todos.unshift(todo)
        this.setState({todos})
      }
      render(){
        const {todos} = this.state
        return (
          <div>
            <h1>Simple TODO List</h1>
            <Add addTodo={this.addTodo} count={todos.length + 1}></Add>
            <List todos={todos}></List>
          </div>  
        )
      }
    }
    class Add extends React.Component{
      constructor(props){
        super(props)
      }    
      add = () =>{
        // 读取输入的数据
        const todo = this.todoInput.value.trim()
        // 检查合法性
        if (!todo) {
          return
        }
        // 添加
        this.props.addTodo(todo)
        // 清除输入
        this.todoInput.value = ''
      }
      render(){
        return (
          <div>
            <input type="text" ref={input => this.todoInput = input} />
            <button onClick={this.add}>add #{this.props.count}</button>
          </div>
        )
      }
    }
    class List extends React.Component{
      render(){
        return (
          <ul>
            {
              this.props.todos.map((todo,index)=>{
                return <li key={index}>{todo}</li>
              })
            } 
          </ul>
        )
      }
    }
    Add.propTypes = {
      count: PropTypes.number.isRequired,
      addTodo: PropTypes.func.isRequired
    }
    List.propTypes = {
      todos: PropTypes.array.isRequired
    }
    ReactDOM.render( <App></App> , document.getElementById('demo'))
  </script>
</body>
</html>

表单提交

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello React!</title>
  <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
  <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
  <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
  <script src="https://unpkg.com/[email protected]/prop-types.js"></script>
</head>

<body>
  <div id="demo"></div>
  <script type="text/babel">
    class LoginForm extends React.Component{
      constructor(props){
        super(props)
        this.state = {
          pwd: ''
        }
      }
      handleSubmit = (event) =>{
        // 阻止事件默认行为
        const name = this.nameInput.value
        const {pwd} = this.state
        alert(`${name},'------',${pwd}`)
        event.preventDefault()
      }
      handleChange = (event) =>{
        // 读取输入的值
        const pwd = event.target.value
        // 更新pwd的状态
        this.setState({pwd})
      }
      render() {
        return (
          <form action="" onSubmit={this.handleSubmit}>
          用户名: <input type="text" ref={input => this.nameInput = input} />
          密码: <input type="password" value={this.state.pwd} onChange={this.handleChange} />
          <input  type="submit" value="登陆"/>
        </form>
        )
      }
    }
    ReactDOM.render(<LoginForm></LoginForm>,document.getElementById('demo'))
  </script>
</body>
</html>

生命周期

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello React!</title>
  <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
  <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
  <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>

<body>
  <div id="demo"></div>
  <script type="text/babel">
    // 1.定义组件
    class Life extends React.Component {
      constructor(props){
        super(props)
        this.state = {
          opacity: 1
        }
      }

      // 组件挂载到页面时
      componentDidMount(){
        // 启动循环定时器
        this.intervalId = setInterval(() => {
          console.log('定时器执行');
          let {opacity} = this.state
          opacity -= 0.1
          if (opacity <= 0) {
            opacity = 1
          }
          this.setState({opacity})
        }, 200);
      }

      distroyComponent = () => {
        // 调用删除组件方法删除组件
        ReactDOM.unmountComponentAtNode(document.getElementById('demo'))
      }

      // 组件将要被卸载时触发
      componentWillUnmount(){
        // 清理定时器
        clearInterval(this.intervalId)
      }

      render() {
        const {opacity} = this.state
        return (
          <div>
            <h2 style={{'opacity': opacity}}>{this.props.msg}</h2>
            <button onClick={this.distroyComponent}>嗝屁了</button>
          </div>
        ) 
      }
    }
    ReactDOM.render( < Life msg="react恶心啊"  / > , document.getElementById('demo'))
  </script>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章