初始React规范,React的特点和react组件和JSX

React

一:React介绍

网址:https://zh-hans.reactjs.org/

再也看不到操作节点的操作

1.特点
  • 自动化的UI状态管理

  • 虚拟DOM

    用普通js对象来描述DOM结构,因为不是真实DOM,所以称之为虚拟DOM。(通过虚拟DOM来改变节点,把改变后的虚拟DOM和真实DOM比较,然后更新节点)

    好处:简化了DOM操作,提高了性能

  • 组件化开发

    组件化和模块化的共同点:都可以复用

    区别:组件化:根据不同的功能,不同的标签划分成不同的组件;模块化:是实现代码的管理,把一个页面分为多个模块;

    组件化:不同的标签划分成不同的组件,然后把所有组件组合在一起(结构,样式和行为)(一般要将组件化和模块化一起用,因为有了模块化才能更好的实现组件化),组件化就是把各个功能组件化,各自有各自的结构,样式和行为,用的时候可以直接调用这个组件

  • 完全在Javascript中定义UI

  • JSX

    1.里面可以使用html标签

  • 只是MVC架构中的v

    模型 视图 控制

  • 单向数据流

    数据传递只有一个方向(父组件—>子组件),能追寻都溯源

    why:如果把他设置为双向传递,性能会变低,而且追寻溯源比较困难

二:使用方法

createElwment("标签名","属性","标签的内容")

方法1:直接写入
  1. 引入在线的React插件

     <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    
  2. 案例

     //书写方式1:直接写
    ReactDOM.render(React.createElement("h1", { title: "hello" }, "hello word"), document.getElementById("root"));
    
方法2:组合方式写
 //书写方式2:组合方式写
let HElement = React.createElement("h1", { title: "hello" }, "hello word");
let pElement = React.createElement("p", null, "段落1");
let RootElement = React.createElement("div", null,HElement,pElement);
ReactDOM.render(RootElement, document.getElementById("root"));
方法3:JSX语法

JSX是技术内定义的一套XML语法,语序在JS内像编译HTML代码一样的编写组件,最终都会被相应的工具编译成Javascript

React官方推荐使用JSX来编写组件

1.规范
  1. 组件可以嵌套组件;

  2. 组件可以当作标签来使用;

  3. JSX规则和XML一样

  4. 标签必须染个闭合 <RootElement />

  5. 属性

    • 大部分属性和html标签一致

    • 两个特殊:for=>htmlFor;class->className

      <label htmlFor="p1">内容</label>
      <p className="p1" id="p1">段落1</p>
      
    • 可以自定义属性

  6. 花括号{}

    • 如果引用变量必须使用花括号
    • 里面能进行运算,但是不能使用条件语句和循环语句
  7. 注释{/**/}

2.用法
  1. 引入JSX的babel

    <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
    
  2. 案例

    注意:1.在写script的时候,记得加type="text/babel"

    ​ 2.return后面不能换行跟东西,不然会报错,如果偏要换行,就要要换行的时候加上一个()

    ​ 3.{}3.1:引用变量的语法,不能在外面加入"";3.2:里面能进行运算,但是不能使用条件语句和循环语句

    <script type="text/babel">
        let H1Element = function(){
                    return <h1>hello React</h1>
                }
                let PElement = function(){
                    return <div>
                        <label htmlFor="p1">内容</label>
                        <p className="p1" id="p1">段落1</p>
                    </div>
                }
                let RootElement = function(){
                    return <div>
                        <H1Element></H1Element>
                        <PElement></PElement>
                        </div>
                }
                ReactDOM.render(<RootElement />,document.getElementById("root"));
     </script>
    
3.循环

通过数组来进行循环

{}1.引用变量的语法,不能在外面加入"";2:里面能进行运算,能调用方法,但是不能使用条件语句和循环语还有判断语句

 let H1Element = function(){
            return <h1>hello React</h1>
        }
        let PElement = function(){
            let Pcontent = "我是段落1";
            let className = "p1"
            return <div>
                    <label htmlFor="p1">内容</label>
                    <p className={className} id="p1">{Pcontent}</p>
                </div>
        }
        let RootElement = function(){
           let arr = [1,2,3,4,5,6];
            //用Array创建一个数组,你需要多少个的时候,你就写多少,在里面在填充为0的数字(因为反正数字在里面都没啥用)
            let ary = new Array(10).fill(0);
            return <div>
                <H1Element></H1Element>
                {ary.map(()=><PElement></PElement>)}
                </div>
        }
        ReactDOM.render(<RootElement />,document.getElementById("root"));
4.JSX中的注释

{/*注释*/}

function render(){
	return <p>
		{/*这是注释内容*/}
	</p>
}

三:React中的组件

概念:组件是编写React应用的基础,一个应用就是由大大小小的组件组合而成

组件分类:
  1. 无状态组件-普通函数定义,无状态,没有生命周期,能过够优化性能

    function Top() {
                return <div></div>
            }
    
     let PElement = function(){
                let Pcontent = "我是段落1";
                let className = "p1"
                return <div>
                        <label htmlFor="p1">内容</label>
                        <p className={className} id="p1">{Pcontent}</p>
                    </div>
            }
    
  2. 有状态组件:推荐ES6语法定义,React内部会创建实例,并拥有完整的生命周期;还有Hook写法

    class PElement extends React.Component {
                render() {
                    return <div></div>
                }
            }
    
     class PElement extends React.Component {
                render() {
                    let Pcontent = "我是段落1";
                    let className = "p1"
                    return <div>
                        <label htmlFor="p1">内容</label>
                        <p className={className} id="p1">{Pcontent}</p>
                    </div>
                }
            }
    

四:组件的规范

  1. 每一个组件必须有返回值,如果返回值又是一个组件则必须有且仅有一个根元素
  2. 如果返回null或false,编译时会被替换为<noscript>

五:组件的传参

1.在由组件组成的应用中,组件之间的关系主要是父与子,类似于HTML标签

2.数据可以在组件之间传递,不过只能是单向,由父传递给子组件

3.用到的对象props(1):通过自定义属性传递(2):通过文本内容传递-children

只能单向传递数据流(父组件传递子组件):数字,对象,样式

  1. 无状态逐渐传参

    能传属性值,父组件可以自定义名字传递给子组件props.属性名

    <h1 title={props.myTitle}>hello React</h1>
    

    传递标签里面的内容用props.children

    <p className={className} id="p1">{props.children}</p>
    
    let H1Element = function(props){
        return <h1 title={props.myTitle}>hello React</h1>
    }
    let PElement = function(props){
        let className = "p1"
        return <div>
            <label htmlFor="p1">内容</label>
        <p className={className} id="p1">{props.children}</p>
        </div>
    }
    let RootElement = function(){
        let arr = ["段落1","段落2","段落3","段落4"];
        return <div>
            <H1Element myTitle="标题1"></H1Element>
        	{arr.map((item)=><PElement>{item}</PElement>)}
                 </div>
    }
    ReactDOM.render(<RootElement />,document.getElementById("root"));
    
  2. 有状态组件传参(用this)

    class H1Element extends React.Component {
        render(props) {
        	return <h1 title={this.props.mytitle}>hello React</h1>
        }
    }
    
  3. 设置样式

    方法1:

     let H1Element = function(props){
         return <h1 title={props.myTitle} style={{color:"red",backgroundColor:"yellow"}} >hello React</h1>
    }
    

    方法2:

    let H1Element = function(props){
        let style = {color:"red",backgroundColor:"yellow"};
        return <h1 title={props.myTitle} style={style} >hello React</h1>
    }
    

    方法3:单独设置颜色

    let PElement = function(props){
        let Pcontent = "我是段落1";
        let className = "p1";
        let style = {
            color:"red",
            backgroundColor:"yellow",
            ...props.style
        };
        return <div>
            <label htmlFor="p1">内容</label>
        <p className={className} id="p1" style={style}>{props.children}</p>
        </div>
    }
    let RootElement = function(){
        let arr = [
            {
                letter:"段落1",
                style:{
                    color:"blue",
                    backgroundColor:"green"
                }},
            {
                letter:"段落2",
                style:{
                    color:"blue",
                    backgroundColor:"skyblue"
                }},
        ]
        return <div>
            <H1Element myTitle="标题1"></H1Element>
        {arr.map((item)=><PElement style={item.style}>{item.letter}</PElement>)}
        </div>
    }
    ReactDOM.render(<RootElement />,document.getElementById("root"));
    

六:实例,24字母不同背景颜色完成

<body>
    <div id="root"></div>
    <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
    <script type="text/babel">
        //卡片
        class Card extends React.Component {
            render(props) {
                function color() {
                    let r = Math.floor(Math.random() * 256);
                    let g = Math.floor(Math.random() * 256);
                    let b = Math.floor(Math.random() * 256);
                    return "rgb(" + r + "," + g + "," + b + ")";
                }

                console.log(color());
                let style = { color: "black", backgroundColor: color(), width: "50px", height: "50px", textAlign: "center", lineHeight: "50px" };
                return <div style={style}>
                    {this.props.children}
                </div>
            }
        }
        //盒子
        class Root extends React.Component {
            render() {
                let ary = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "G", "K","R","M","N","O"];
                let style = { width: "270px", height: "270px", display: "flex", justifyContent: "space-around", flexWrap: "wrap", margin: "auto", border: " 1px solid" };
                return <div style={style}>
                    {ary.map((item) => <Card>{item}</Card>)}
                </div>
            }
        }
        ReactDOM.render(<Root />, document.getElementById("root"))
    </script>
</body>

七:如何划分组件

  1. 每个组件干的事情不能太多。否则粒度过哒,重用性低
  2. 粒度过细,导致代码量增加,复杂度增加
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值