react基础篇

前言:

        通过学习尚硅谷react课程基础篇的一些小笔记


01_虚拟DOM两种创建方式

  • js创建

//1.创建虚拟DOM
const VDOM = React.createElement('h1', { id: 'title' },'Hello_React')
//2.渲染虚拟DOM到页面
ReactDOM.render(VDOM, document.querySelector('#test'))
  • jsx创建

//1.创建虚拟DOM
const VDOM = (
    <h1 id="title">
        <span>hello_react</span>
    </h1>
)
//2.渲染虚拟DOM到页面
ReactDOM.render(VDOM,document.querySelector('#test'))

02_关于虚拟DOM

  • 本质是object类型的对象(一般对象)

  • 虚拟DOM比较'轻',真实dom比较'重',即身上的方法.因为虚拟DOM是react在使用 无需真实dom那么多的属性

  • 虚拟DOM最终会被React转化为真实DOM,呈现在页面上

03_jsx语法规则

  • 定义虚拟DOM时,不要写引号

  • 标签中混入JS表达式时要用{}

  • 样式的类名指定不能使用class,只能是calssName

  • 只能有一个根标签

  • 标签必须闭合

  • 内联样式,要用style={{key:value}}的形式来写

  • 标签首字母

    • 若小写字母开头 则将标签转为html中同名元素

    • 若大写字母开头 react就去渲染对应的组件 若没有对应的组件就报错



//1.创建虚拟dom
const VDOM = (
    <div>
        <h1 id={myId.toLowerCase()}>
            <span className='demo'>{myData.toUpperCase()}</span>
        </h1>
        <p style={{ backgroundColor: 'orange', color: 'green' }}>内联样式</p>
        <input type="text" />
    </div>
    )
​
    //2.渲染虚拟DOM到页面
    ReactDOM.render(VDOM, document.querySelector('#test'))

04_jsx中的{}的注意点

jsx中{}里只能包含表达式不能包含语句

  • 表达式:一个表达式会产生一个值 可以放到任何一个需要值的地方

    • 例: (1):a

    ​            (2):a+b

    ​            (3):demo()

    ​            (4):arr.map()

  • 语句(代码)

    • 例: (1):if(){}

    ​             (2):for(){}

    ​             (3):swich(){}

05_react创建组件

  • 函数式组件

    • 执行了渲染发生了:

      • react 解析组件标签找到了MyComponent组件

      • 发现是函数定义的 将函数返回值的虚拟DOM转化为真实DOM,随后呈现在页面.

// 1.创建函数式组件
function MyComponents() {
    return <h2>我是用函数定义的组件(适用于【简单组件】的定义)</h2>
}
// 2.渲染组件到页面
ReactDOM.render(<MyComponents />, document.querySelector('#test'))
  • 类式组件

    • 执行了渲染发生了:

      • react 解析组件标签找到了MyComponent组件

      • 发现是类定义的 随后自动new出来该类的实例,并通过实例调用到原型上的render方法

      • 将render 返回值的虚拟DOM转化为真实DOM,随后呈现在页面中

    // 1.创建一个类式组件
    class MyComponents extends React.Component {
        render() {
            //render 是MyComponents的原型对象上 供实例使用
            return <h2>我是用类定义的组件(适用于【复杂组件】的定义)</h2>
        }
    }
    // 2.渲染组件到页面
    ReactDOM.render(<MyComponents />, document.querySelector('#test'))

06-组件实例的三大属性-state

完整写法

class Weather extends React.Component {
    constructor(props) {
        super(props)
        // 初始化状态
        this.state = { isHot: false }
        // 解决toggleHot中的this指向问题
        this.toggleHot = this.toggleHot.bind(this)
    }
    render() {
        // 读取状态
        const { isHot } = this.state
        return <h2 onClick={this.toggleHot}>今天的天气很{isHot ? '炎热' : '凉爽'}</h2>
    }
    toggleHot() {
        // 直接修改state中的值 要调用setState这个API
        this.setState({isHot:!this.state.isHot})
    }
​
}
ReactDOM.render(<Weather />, document.querySelector('#test'))

简写

class Weather extends React.Component {
    // 初始化状态
    state = { isHot: true }
render() {
    const { isHot } = this.state
    return <h2 onClick={this.toggleHot}>今天的天气很{isHot ? '炎热' : '凉爽'}</h2>
}
// 自定义方法 --  要用赋值语句的形式+箭头函数
toggleHot = () => {
    this.setState({ isHot: !this.state.isHot })
    }
}
ReactDOM.render(<Weather />, document.querySelector('#test'))

07_组件实例的三大属性-props

  • props的基本使用

    class Person extends React.Component {
        render() {
            const { name, age, sex } = this.props
            return (
                <ul>
                    <li>name:{name}</li>
                    <li>age:{age + 1}</li>
                    <li>sex:{sex}</li>
                </ul>
            )
        }
    }
    //  传入不同的值
    ReactDOM.render(<Person name='Tom' age={19} sex='男' />, document.querySelector('#test'))
    ReactDOM.render(<Person name='jerry' age={17} sex='女' />, document.querySelector('#test2'))
  • 对props进行限制

    //此时在类外面创建
    // 对props参数进行限定
    Person.propsTypes = {
        name: PropTypes.string.isRequired, // 限制name属性为必填和必须为字符串
        age: PropTypes.number, // 限制age属性必须为数字
        sex: PropTypes.string, // 限制sex属性为字符串
        speak: PropTypes.func  // 限制speak是个函数
    }
    // 对props参数设置默认值
    Person.defaultProps = {
        sex: '男',
        age: 18
    }
  • 类型限制的简写形式

    //此时在类中创建使用static关键字
    static propsTypes = {
        name: PropTypes.string.isRequired, // 限制name属性为必填和必须为字符串
        age: PropTypes.number, // 限制age属性必须为数字
        sex: PropTypes.string, // 限制sex属性为字符串
        speak: PropTypes.func  // 限制speak是个函数
    }
    // 对props参数设置默认值
    static defaultProps = {
        sex: '男',
        age: 18
    }

  • 函数组件的props用法

// 对参数进行限定---Person创建的函数组件
Person.propsTypes = {
    name: PropTypes.string.isRequired, // 限制name属性为必填和必须为字符串
    age: PropTypes.number, // 限制age属性必须为数字
    sex: PropTypes.string, // 限制sex属性为字符串
    speak: PropTypes.func  // 限制speak是个函数
}
// 对props参数设置默认值
Person.defaultProps = {
    sex: '男',
    age: 18
}

08_组件实例的三大属性-refs

字符串写法

showData = () =>{
    console.log(this.refs.input1.value);
}
showData2 = () =>{
    console.log(this.refs.input2.value);
}
render(){
    return (
        <div>
            <input ref="input1" type="text" placeholder="点击按钮提示数据" />
            <button onClick={this.showData}>点击展示左侧输入的值</button>
            <input ref="input2" type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} />
        </div>
    )
}

回调函数写法

showData = () => {
    console.log(this.input1.value);
}
showData2 = () => {
    console.log(this.input2.value);
}
render() {
    return (
    <div>
        <input ref={c => this.input1 = c} type="text" placeholder="点击按钮提示数据" />
        <button onClick={this.showData}>点击展示左侧输入的值</button>
        <input ref={c => this.input2 = c} type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} />
    </div>
    )
}

CreateRefs写法

​ 每个ref指定的元素都只能有一个createRef()接收

myRef1 = React.createRef()
myRef2 = React.createRef()
showData = () => {
    console.log(this.myRef1.current.value);
}
showData2 = () => {
    console.log(this.myRef2.current.value);
}
render() {
    return (
        <div>
            <input ref={this.myRef1} type="text" placeholder="点击按钮提示数据" />
            <button onClick={this.showData}>点击展示左侧输入的值</button>
            <input  ref={this.myRef2} type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} />
        </div>
    )
}

09_事件处理

  • 通过onXxx属性指定事件处理函数(注意大小写)

    • :React使用的是自定义事件,而不是使用的原生DOM事件 ---为了兼容性

    • React中的事件是通过事件委托方式处理的 --- 为了高效

  • 通过exent.target得到发生事件的DOM元素对象

showData = () => {
    console.log(this.input1.value)
}
showData2 = (e) => {
    console.log(e.target.value)
}
render() {
    return (
        <div>
            <input ref={c => this.input1 = c} type="text" placeholder="点击按钮提示数据" />
            <button onClick={this.showData}>点击展示左侧输入的值</button>
            <input type="text" placeholder="失去焦点提示数据" onBlur={this.showData2} />
        </div>
    )
}

10_表单提交数据

非受控组件

handleSubmit = (e) => {
    e.preventDefault()
    const { userName, password } = this
    console.log(`用户名是${userName.value},密码是${password.value}`);
}
render() {
    return (
        <form onSubmit={this.handleSubmit}>
            用户名: <input ref={c => this.userName = c} type="text" name="username" />
            密码: <input ref={c => this.password = c} type="password" name="password" />
            <button>提交数据</button>
        </form>
    )
}

受控组件

state = { userName: '', password: '' }
saveUserName = (e) => {
    this.setState({ userName: e.target.value })
}
savePassword = (e) => {
    this.setState({ password: e.target.value })
}
handleSubmit = (e) => {
    e.preventDefault()
    const { userName, password } = this.state
    console.log(`用户名是${userName},密码是${password}`);
}
render() {
    return (
        <form onSubmit={this.handleSubmit}>
            用户名: <input onChange={this.saveUserName} type="text" name="username" />
            密码: <input onChange={this.savePassword} type="password" name="password" />
            <button>提交数据</button>
        </form>
    )
}

11_高阶函数和函数柯里化

  • 高阶函数:如果一个函数符合下列两个条件之一 就是高阶函数

    • 该函数接收的参数是一个函数 那么该函数可以呗称之为高阶函数

    • 该函数调用的返回值依然是一个函数 就被称之为高阶函数

    • 例 :Promise setTimeout arr.map()等

  • 函数的柯里化

    • 通过函数的调用继续返回函数的方式 实现多次接收参数最后统一处理函数的编码形式

state = { username: '', password: '' }
saveFormData = (DataType) => {
    return (e) => {
        this.setState({[DataType]:e.target.value})
    }
}
​
handleSubmit = (e) => {
    e.preventDefault()
    const { username, password } = this.state
    console.log(`用户名是${username},密码是${password}`);
}
render() {
    return (
        <form onSubmit={this.handleSubmit}>
            用户名: <input onChange={this.saveFormData('username')} type="text" name="username" />
            密码: <input onChange={this.saveFormData('password')} type="password" name="password" />
            <button>提交数据</button>
        </form>
    )
}

12_生命周期

旧生命周期

新生命周期

  • 在新版本中 修改了:

    • componentWillMount钩子 修改为UNFAFE_componentWillMount 后续版本可能废弃

    • componentWillUpdate钩子 修改为UNFAFE_componentWillUpdate 后续版本可能废弃

    • componentWillReceiveProps钩子 修改为UNFAFE_componentWillReceiveProps 后续版本可能废弃

  • 在新版本中 新增了:

    • getDerivedStateFromProps 若state的值在任何时候都取决于props,那么就可以使用getDerivedStateProps

    • getSnapshotBeforeUpdate 在更新渲染之前做些事情 例获取更新前的滑轮距离...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值