美文网首页
03 react组件

03 react组件

作者: Aries蓝 | 来源:发表于2019-12-02 11:08 被阅读0次

    1.一个普通的 构造函数就是 组件

    function Hello(props ) {
    
     // props 所有的属性都是只读的
     // 接受父组件传递过来的参数
    
     // 结论:不论是 vue 还是 React 组件中的props 永远都是只读的,不能重新赋值
    
      // 如何在一个组件中 return 一个null ,表示组件是空的,什么都不会渲染
      // return null
    
      //在组件中,必须返回一个合法的 JSX 虚拟DOM 元素
    
    let name = props.name //  大黄
    
    return <div>这是Hell哦哦哦</div>
    }
    
    
    // 给组件传递参数  在组件上加属性
    let name = '大黄'
    
    ReactDOM.render(
      <Hello name={name}></Hello>
      ,document.getElementById('app')
    )
    

    给组件传递props 参数步骤:
    1.给组件添加属性,使用 <Hello name={name}></Hello>

    let dog  =  {
    name :'基督教',
    age:18,
    
    }
     // 方式一
    <Hello name={dog.name}  age = {dog.age}>
    </Hello>
    // 方式二 
    <Hello (...dog)>
    </Hello>
    

    2.在组件构造函数中接受参数function Hello(props ) {} 参数在props对象中 props 是只读的

    2 创建一个JSX文件

    1 创建一个 Demo.jsx文件

    
    import React from 'react'; // 创建组件,虚拟DOM元素,生命周期
    
    //我们看到,代码中除了开头引入时出现了React,其它地方都没有其踪影。但是当去掉import React from "react"时,程序却会执行出错ReferenceError: React is not defined。
    
    
    // 为什么每个函数组件需要引入 react  因为 我们的JSX语法只是一种语法糖,它最终会被转译成纯粹的js语法,因此在babel转译之后,我们的代码就变成了:
    
    //比如
    const App = () => (
      <div>Hello World!!!</div>
    );
    
    //转译后的
    var App = function App() {
      return React.createElement(
        "div",
        null,
        "Hello World!!!"
      );
    };
    
    
    
    function Demo(props) {
    
        return <div>这是一个组件</div>
    }
    
    // 把组件导出
    
    export default Demo
    
    

    2.然后在需要使用组件的地方引入组件

    // 默认,如果不做单独的配置,不能省略 .jsx 后缀名
    
    
    import React from 'react'; // 创建组件,虚拟DOM元素,生命周期
    import ReactDOM from 'react-dom' ;//把创建好的组件和虚拟DOM放到页面上展示的
    
    import Demo from './../components/Demo.jsx'
    ReactDOM.render(
        <div>
            <Hello name={name}></Hello>
            <Demo></Demo>
        </div>
        ,document.getElementById('app')
    )
    

    如果想省略.jsx 后缀名的话 需要配置 webpack
    在webpack.config.js 加入 resolve

    module.exports = {
        mode:'production' ,//development production
    
        //在 webpack 4.x 中。有个很大的特性,就是约定大于配置 约定,默认打包入口路径是 src -> index.js
        //那些node 支持 chrome 支持的就行
    
    
        plugins:[
            htmlPlugin
        ],
        module: { //所有第三方 模块的配置规则
            rules: [
                { test: /\.js|jsx$/, use: 'babel-loader', exclude: /node_modules/ }
                // 千万不要忘记加 exclude 排除选项
            ]
        },
        resolve:{
            extensions:['.js','.jsx','.json'] ,//表示这几个文件的后缀名,可以省略不写,这几个位置很重要 按顺序补全的
         alias:{
                '@':path.join(__dirname,"./src") // 配置别名
            }
        }
    }
    

    3 将组件用Class 创建

    import React from 'react'; // 创建组件,虚拟DOM元素,生命周期
    import ReactDOM from 'react-dom' ;//把创建好的组件和虚拟DOM放到页面上展示的
    
    
    // 如果要使用 class 定义组件,必须让自己的组件,继承自React.Component
    
    // class 组件名称 extends React.Component{
    //
    //     // 在组件内部,必须有 render 函数
    //
    //     render(){
    //
    //         //render 函数中,必须返回合法的 JSX 虚拟 DOM 结构
    //         return <div>jskdksk</div>
    //     }
    // }
    
    var arr = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    
    
    class Movie extends React.Component {
     constructor(){
    
            // 由于Movie组件,继承了 React.Component 这个父类,所以自定义的构造器中,必须调用super()
            super()
    
            this.state = {
                msg :'大家好我是 Movie 私有组件'
    
            }  // 这个 this.state={} 就相当于 Vue 中的 data(){return{}}
        }
        render() {
    
            // return null
            // 在class 关键字 创建 的组件中,如果要使用 外界传递过来的 props 参数,不需要接收,直接通过哦this.props.****来接收
            return <div>
                这是 movie
                {
                    arr.map((item) => {
                        return <div>{item}</div>
                    })
                }
    
    
                {/*{注意在 class 组件中 this 指向当前组件的实例对象}*/}
                <div>{this.props.name}</div>
    
                {/*{state私有数据}*/}
                <div>{this.state.msg}</div>
            </div>
    
    
        }
    
    }
    
    export default Movie
    
    

    3 两种创建组件方式的对比

    注意:使用class 关键字创建的组件,有自己的私有数据 和生命周期
    注意:使用function 创建的组件,只有props ,没有自己私有数据和生命周期函数。
    class 创建出来的 state 可读可写

    1.用构造函数创建出来的组件:叫做无状态组件(无状态组件今后用的不多)
    2.用class 关键字创建出来的组件:叫做有状态组件

    有状态组件和无状态组件之间的本质区别就是:有误state 属性,和有无生命周期
    3:什么情况下使用有状态组件?什么情况下使用无状态组件?
    如果一个组件需要自己的私有数据,则推荐使用Class 创建的 有状态组件
    如果一个组件不需要私有数据,则推荐使用:无状态组件
    React 官方说:无状态组件,由于没有state和 生命周期函数 所以运行效率会比有状态组件快一些
    4.组件中的 props 和 state/data 之间的区别

    props 中的数据都是外界传过来的
    state/data 中的数据,都是组件私有的
     props中的数据都是只读的,不能重新赋值
     state/data中的数据都是可度可写的
    

    相关文章

      网友评论

          本文标题:03 react组件

          本文链接:https://www.haomeiwen.com/subject/edexgctx.html