React入门(一)

代码 代码 1388 人阅读 | 0 人回复

<
React



一.React简介

1.1引见

1.React是一个构建用户界里的JavaScript库;
2.React次要用于构建UI,很多人以为React是MVC中的V(视图);
3.React来源于Facebook的内乱部项目,用去架设Instagram的网站,并取2013年5月开源;
4.React具有较下的机能,代码逻辑十分俭朴,愈来愈多的人曾经开端存眷战利用它。
1.2特性

如今看起去能够感触感染没有是很较着~,等前期上了代码以后,必然要记得转头看哦


  • 下效:React经由过程对DOM的模仿,最年夜限度天削减取DOM的交互;
  • 灵活:React能够取已知的库或框架很好天共同;
  • JSX:JSX是JavaScript语法的扩大。React开辟纷歧定利用JSX,但我们倡议利用它。
  • 组件:经由过程React构建组件,使得代码愈加简单获得复用,可以很好的使用正在年夜项目标开辟中。
    单背呼应的数据流,React
    完成了单背呼应的数据流,从而削减了反复代码,那也是为何比传统数据绑定更俭朴。
1.3框架比照

取其他框架的配合面皆是,皆接纳假造DOM战数据驱动。
angularJsreactJsvueJs掌握器√--过滤器√-√指令√-√模板语法√-√效劳√--组件-√√jsx-√2.0以后参加
214756p5sir5ahvhg5iq5l.jpg

两.情况拆建

2.1引进文件的方法

1.React.js:React的中心库,剖析组件,辨认jsx。
  https://cdn.staticfile.org/react/16.4.0/umd/react.development.js
2.reactDom.js:处置有dom相干的操纵。
  https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js
3.Babel.js:将 ES6 代码转为 ES5 代码。
  https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js
2.2民圆足脚架(模块化)

前期解说。。。
三.HelloWorld

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Hello React!</title>
  6. <!-- react的中心库,剖析组件,辨认jsx-->
  7. <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
  8. <!-- 处置dom相干的操纵 -->
  9. <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
  10. <!-- 将es6代码转化为es5代码 -->
  11. <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
  12. </head>
  13. <body>
  14.     <div id="box">
  15.     </div>
  16. </body>
  17. </html>
  18. <script type="text/babel">
  19.         ReactDOM.render(
  20.         // ReactDOM.render 是 React 的最根本办法。用于将JSX写的模板(颠末模板衬着(把javascript的成果交换单花括号里的内乱容))转为 HTML 言语,并衬着到指定的HTML标签里。
  21.             <h1>Hello, world!</h1>, //JavaScript中居然能够写HTML代码,那便是JSX
  22.             document.getElementById(&#39;box&#39;)
  23.         );
  24. </script>
复造代码
  ReactDOM.render( JSX写的html模板,dom容器工具);
总结:一个react的法式,便是把JSX经由过程ReactDOM.render()函数衬着到网页上。
  留意:Script标签中的type与值为:text/babel。
总结
1.一个react的法式,是经由过程jsx经由过程ReactDO.render()函数衬着到网页上。
2.React的代码也能够零丁写正在一个文件中,扩大名为js/jsx。引进时记着type="text/babel’。
四.JSX

214756ucl52c6097k6j1lu.jpg

4.1引见

1.JSX是JavaScript xml,是JavaScript的语法扩大,只需HTML代码写正在JS里,那便是JSX。JSX正在挨包阶段皆曾经编译成杂JavaScript,没有会带去任何反作用,反而会让代码愈加曲不雅并易于保护。
4.2特性



  • JSX施行更快,由于它正在编译为JavaScript代码后举办了劣化;
  • 它是范例宁静的,正在编译过程当中就可以发明毛病;
  • 利用JSX编写模板愈加俭朴快速。
4.3语法

实在便是取本来HTML中的区分。话未几道,去段代码,让我瞧瞧有啥区分。。。
  1. var msg="哥们!"
  2. const element = <h1>Hello, world!{msg}</h1>   
  3. //出有单引号,没有是字符串
  4. const List = () => (
  5. ​      <ul>
  6. ​        <li >list item</li>
  7. ​        <li>list item</li>
  8. ​        <li>list item</li>
  9. ​      </ul>  
  10.   );   
复造代码
214757znodcrzlt44hwf4o.jpg

XML根本语法


  • 只能有一个根标签,养成里面减上圆括号的风俗(自止领会圆括号的感化哈,练很多了便有感jiao了)
  • 标签要闭开(留意单标签
4.1.1元素范例



  • 小写尾字母对应 HTML的标签,组件名尾字母年夜写。
  • 正文
    ①利用 /* 内乱容 */
    ②html标签内乱正文{/*最中层有花括号*/}
4.1.2元素属性



  • 内乱联款式的style:款式名以驼峰定名法暗示。 默许像素单元是 px,则px不用写。
  1. let _style = { backgroundColor:"red" };       
  2.         ReactDOM.render(
  3.             <h1 style={_style}>Hello, world!</h1>,
  4.             document.getElementById(&#39;box&#39;)
  5.         );
复造代码


  • 内部款式的class:HTML中已经的 class 属性改成 className(由于class是js的枢纽字),内部款式时利用
  1. ReactDOM.render(
  2.             <h1  className="bluebg">Hello, world!</h1>,
  3.             document.getElementById(&#39;box&#39;)
  4.         );
复造代码


  • for 属性改成 htmlFor(由于for是js的枢纽字)。(for属性正在html标签中是扩大单选框|复选框的挑选范畴)
  • 变乱名用驼峰定名法。HTML是齐小写(onclick),JSX中是驼峰(onClick)
4.1.3JavaScript表达式



  • 利用单花括号。留意单花括号中只能写表达式,不克不及写语句。
  1. const element = <h1>Hello, {120+130}!</h1>
  2. const element = <h1>Hello, {getName("张三疯")}!</h1>
  3. <input type="text" value={val ? val : ""} />
复造代码
五.前提衬着

  1. var age = 19;
  2.     if (age >= 18) {
  3.       var ageShow = <p>能否成年:已成年</p>;
  4.     } else {
  5.       var ageShow = <p>能否成年:已成年</p>;
  6.     };
  7.     function show(score) {   
  8.     switch (true) {
  9.         case score<60: var str = <p>亲,您得享用免费重建的时机</p>            
  10.             break;
  11.         case score>=60 && score<=70:var str = <p>亲,您教得挺好</p>            
  12.             break;
  13.         case score>70 && score<=100:var str = <p>亲,您是教霸</p>            
  14.             break;
  15.         default:
  16.             break;
  17.     }   
  18.     return str;
  19. }
  20.     ReactDOM.render(
  21.       <div>
  22.         <div>{ageShow}</div>
  23.       <div>{show(90)}</div>
  24.       </div>,
  25.       document.getElementById("box")
  26.     );
复造代码


  • 数据去自后端,怎样衬着???
  1.   // jsx的数组,能够间接衬着到页里上
  2.     var arr = [
  3.       <li>怎样让富婆爱上我</li>,
  4.       <li>蛮横总裁爱上我</li>,
  5.       <li>啦啦啦啦</li>,
  6.     ];
  7.     function show(arr) {
  8.       // return arr.map(item=>{
  9.       //   // 只要一止,则能够简写
  10.       //   return (<li>{item}</li>)
  11.       // })
  12.       return arr.map((item) => <li>{item}</li>);
  13.       // 用一般的for轮回完成
  14.       let jsxArr = [];
  15.       for (let i in arr) {
  16.         jsxArr.push(<li>{arr[i]}</li>);
  17.       }
  18.     }
  19.     ReactDOM.render(
  20.       <div>
  21.         <p>保举给各人的册本</p>
  22.         {/*有无发明,居然不消轮回*/}
  23.         <ul>{arr}</ul>
  24.       </div>,
  25.       document.getElementById("box")
  26.     );
复造代码


  • json数组
  1.     var scores = [98, 61, 85, 59, 50, 99, 85];
  2.     ReactDOM.render(
  3.       <div>
  4.         <h1>合格的成就</h1>
  5.         <ol>
  6.           {scores
  7.             .filter((score) => score >= 60)
  8.             .map((item) => (
  9.               <li>{item}</li>
  10.             ))}
  11.         </ol>
  12.       </div>,
  13.       document.getElementById("box")
  14.     );
复造代码
七.组件

7.1单个组件

1.界说组件的三种方法:函数方法、ES5的写法、ES6(类)的写法。


  • 函数方法:函数的返回值是JSX。
  1. var studens = [
  2.       {
  3.         id: "1001",
  4.         name: "张三",
  5.         project: "前端",
  6.       },
  7.       {
  8.         id: "1002",
  9.         name: "李四",
  10.         project: "JAVA开辟",
  11.       },
  12.       {
  13.         id: "1003",
  14.         name: "王五",
  15.         project: "硬件测试",
  16.       },
  17.       {
  18.         id: "1004",
  19.         name: "张三疯",
  20.         project: "后端开辟",
  21.       },
  22.     ];
  23.     ReactDOM.render(
  24.       <div>
  25.         <p>某班门生根本疑息</p>
  26.         <ul>
  27.           {studens.map((item) => (
  28.             <li>
  29.               <p>教号:{item.id}</p>
  30.               <p>姓名:{item.name}</p>
  31.               <p>专业标的目的:{item.project}</p>
  32.             </li>
  33.           ))}
  34.         </ul>
  35.       </div>,
  36.       document.getElementById("box");
  37.     );
复造代码


  • ES5的写法:React.CreateClass()函数(React16后,曾经被烧毁了)~做为理解
  1. // 界说组件,组件名尾字母年夜写(年夜驼峰)
  2.         function MyCom(){
  3.                 const msg="hello";
  4.                 return (
  5.                         <ul>
  6.                                 <li>{msg}:三国演义</li>
  7.                                 <li>{msg}:白楼梦</li>
  8.                         </ul>
  9.                 )
  10.         }
  11.         ReactDOM.render(
  12.             <MyCom/>,
  13.             document.getElementById(&#39;box&#39;)
  14.         );
复造代码


  • ES6类的写法:界说一个类,担当自 React.Component,正在该类里,必需有个render()函数,render函数返回一个JSX代码
  1. var MyCom = React.createClass({  
  2.   render:function(){ //vue中也有render函数,是完成模板的代码
  3.     return (
  4.       <div>
  5.         <h1>Hello, world!</h1>
  6.       </div>
  7.     );
  8.   }
  9. });
复造代码
7.2组件嵌套

  1. class MyCom extends React.Component {
  2.       constructor() {
  3.         // 挪用女类的机关函数
  4.         super();
  5.         this.state = {
  6.           age: 12,
  7.         };
  8.         this.name = "哆啦A梦";
  9.       }
  10.       render() {
  11.         var msg = "hi";
  12.         return (
  13.           <div>
  14.             <p>{msg}:我仍是个pp</p>
  15.             <p>年齿:{this.state.age}</p>
  16.           </div>
  17.         );
  18.       }
  19.     }
  20.     ReactDOM.render(
  21.       <div>
  22.         {new MyCom().render()}
  23.         <hr />
  24.         <MyCom />
  25.       </div>,
  26.       document.getElementById("box")
  27.     );
复造代码
214757ifo3b22ifiwiyvx2.jpg

八.Props

借记得吗?vue中也有props吆~记了的小火伴,能够戳那女
214758yjdquqc5sfzqjfmw.jpg

另有我呢~
props 是组件对中的接心。吸取内部传进的数据。是组件的属性(同等于html标签的属性)。
留意:Props关于利用它的组件内乱部来讲,是只读的一旦赋值不克不及修正
8.1内部传值:

  1. [/code] [indent]  属性值=“静态值”
  2. 属性值={js数据}
  3. [/indent] [size=5]8.2组件内乱部利用[/size]
  4. 1)[b]函数组件[/b]:{props.属性名}
  5. [code]<组件名 属性名1=值1 属性名2=值2 .. />
复造代码
2)类组件:{this.props.属性名}
  1. function Books(props) {
  2.       return (
  3.         <ul>
  4.           <li>书名:{props.name}</li>
  5.           <li>做者:{props.author}</li>
  6.         </ul>
  7.       );
  8.     }
  9.     ReactDOM.render(
  10.       <div>
  11.         <Books name="皮卡丘" author="me" />
  12.       </div>,
  13.       document.getElementById("box")
  14.     );
复造代码
214758ulfvyxjl8zv3ud1e.jpg

214758razsk6ugmgamr2gn.jpg

214759ffsucyqz7sdyrrd3.jpg

问疑解惑~
214759siwwj6wtta8ew6it.jpg

弥补:假如通报数据较多的话,可使用工具,可是必需利用扩大运算符(…)
  1. class Mycom extends  React.Component{
  2.      constructor(props){
  3.        super();
  4.      }
  5.      render(){
  6.        return(
  7.          <ul>
  8.           <li>书名:{this.props.name}</li>
  9.           <li>做者:{this.props.author}</li>
  10.           </ul>
  11.        )
  12.      }
  13.    }
  14.     ReactDOM.render(
  15.       <div>
  16.         <Mycom name="皮卡丘" author="me" />
  17.       </div>,
  18.       document.getElementById("box")
  19.     );
复造代码
8.3默许值



  • 函数组件
    1)、用 ||
  1. class MyPerson extends React.Component{
  2.         // constructor(props){
  3.         //         super(props);               
  4.         // }
  5.         render(){
  6.                 return (
  7.                         <div>
  8.                                 <p>{this.props.name}</p>
  9.                                 <p>{this.props.sex}</p>
  10.                         </div>
  11.                 )
  12.         }
  13. }
  14. let person={
  15.         name:"张三疯",
  16.         sex:"男"
  17. }
  18. ReactDOM.render(
  19.         <MyPerson {...person}/>,
  20.         document.getElementById(&#39;box&#39;)
  21. );
复造代码
2)、defaultProps
  1.   function Books(props){
  2.       return (
  3.          <ul>
  4.             <li>书名:{props.name||"哆啦A梦"} </li>
  5.             <li>价钱:{props.price||"108"}</li>
  6.          </ul>
  7.     )
  8.   }
  9. ReactDOM.render(
  10.      <div>
  11.         <Books name="您好啊"/>
  12.         </div>,document.getElementById("box")
  13. )
复造代码


  • 类组件
1)、利用static润饰
  1. function Books(props){
  2.      return (
  3.          <ul>
  4.             <li>书名:{props.name}</li>
  5.             <li>做者:{props.price}</li></ul>
  6.      )
  7. }
  8. Books.defaultProps = {
  9.     name:"皮卡丘",
  10.     price:44
  11. }
  12. ReactDOM.render(
  13.      <div>
  14.         <Books name="您好啊"/>
  15.         </div>,document.getElementById("box")
  16. )
复造代码
2)、defaultProps
  1. class Books extends React.Component{
  2.   //类的属性用static润饰
  3.   static defaultProps={
  4.             name:"蓝瘦子",
  5.     author:"没有明"
  6.   }
  7.   render(){
  8.     return (
  9.       <ul>
  10.         <li>书名:{this.props.name}</li>
  11.                 <li>做者:{this.props.author}</li>
  12.         </ul>
  13.     )
  14.   }
  15. }
  16. Books.defaultProps = {
  17.     name:"无书名",
  18.     author:"没有详"
  19. }
  20. ReactDOM.render(
  21.      <div>
  22.         <Books name="您好啊"/>
  23.         </div>,document.getElementById("box")
  24. )
复造代码
函数式组件取类组件默许值的区分
  1. class Books extends React.Component{
  2.   render(){
  3.     return (
  4.       <ul>
  5.         <li>书名:{this.props.name}</li>
  6.                 <li>做者:{this.props.author}</li>
  7.         </ul>
  8.     )
  9.   }
  10. }
  11. Books.defaultProps = {
  12.     name:"无书名",
  13.     author:"没有详"
  14. }
  15. ReactDOM.render(
  16.      <div>
  17.         <Books name="您好啊"/>
  18.         </div>,document.getElementById("box")
  19. )
复造代码
8.4范例查抄:

留意:react15.5后,React.propTypes曾经移进到此外一个库里,请利用prop-types。
  https://cdn.staticfile.org/prop-types/15.6.1/prop-types.js
  1. 格局:
  2. //1)、函数式组件战类组件皆能够:
  3. 组件名.defaultProps={
  4.     属性名: 默许值
  5. }
  6. //2)、若为类组件,能够正在类的内乱部利用static润饰。
  7. static defaultProps={
  8.     属性名: 默许值
  9. }
复造代码
范例名的能够与值为:
  PropTypes.array,
PropTypes.bool,
PropTypes.func,
PropTypes.number,
PropTypes.object,
PropTypes.string,
PropTypes.symbol,
如:
  1. //范例商定:
  2. 组件名.propTypes={       
  3.     属性名1:PropTypes.范例名,
  4.     属性名2:PropTypes.范例名
  5. }
  6. //必传参数
  7. propName: PropsTypes.范例名.isRequired
复造代码
九.state形态机

state 是形态,形态便是数据,state暗示组件的内乱部数据。而props是内部传进组件的数据。
9.1界说并赋初初值

  1.     class Books extends React.Component {
  2.       render() {
  3.         return (
  4.           <ul>
  5.             <li>书名:{this.props.name}</li>
  6.             <li>做者:{this.props.author}</li>
  7.             <li>做者:{this.props.price}</li>
  8.           </ul>
  9.         );
  10.       }
  11.     }
  12.     Books.defaultProps = {
  13.       name: "无书名",
  14.       author: "没有详",
  15.     };
  16.     // 留意巨细写
  17.     Books.propTypes = {
  18.       name: PropTypes.string.isRequired,
  19.       author: PropTypes.string,
  20.       price: PropTypes.number,
  21.     };
  22.     ReactDOM.render(
  23.       <div>
  24.         {/*/由于number是数字,则用单花括号*/}
  25.         <Books name="您好啊" price={128} />
  26.       </div>,
  27.       document.getElementById("box")
  28.     );
复造代码
9.2读与形态

  this.state.属性名
9.3修正形态

必需挪用setState()函数,没有要间接赋值,并且,setState()函数是同步的
修正形态时,必需要挪用setState。由于,只需挪用了setState函数,那便会挪用了render()。假如间接赋值,没有会把数据呼应式天衬着到DOM上。(即:出有调render()函数)
  1. class App extends React.Component {
  2.   constructor(props){   
  3.       super(props);      
  4.       this.state={
  5.               //设置形态的初初值
  6.                  属性名:属性值
  7.       }
  8.   }
  9. }
复造代码
setState()函数是同步的
  1. class Books extends React.Component {
  2.       constructor(){
  3.         super();
  4.         this.state={
  5.           name:"情深深",
  6.             author:"琼瑶",
  7.             desc:{
  8.                 beijing:"bj",
  9.                 date:"shijian"
  10.             },
  11.         }
  12.       }
  13.       changeName(){
  14.         this.setState({
  15.           name:"皮卡丘"
  16.         })
  17.       }
  18.       changeDate(){
  19.         this.setState({
  20.           desc:{
  21.             ...this.state.desc,date:(new Date()).toLocaleString()
  22.           }
  23.         })
  24.       }
  25.       render() {
  26.         return (
  27.           <ul>
  28.             <input type="button" value="修正name" onClick={()=>
  29.               this.changeName()
  30.             }/>
  31.             <input type="button" value="修正工夫" onClick={()=>this.changeDate()} />
  32.             <li>书名:{this.state.name}</li>               
  33.                 <li>做者:{this.state.author}</li>               
  34.                 <li>布景:{this.state.desc.beijing}</li>               
  35.                 <li>工夫:{this.state.desc.date}</li>  
  36.           </ul>
  37.         );
  38.       }
  39.     }
  40.     ReactDOM.render(
  41.       <div>
  42.           <Books/>
  43.       </div>,
  44.       document.getElementById("box")
  45.     );
复造代码


  • 改动形态前
    214759ojaayaoljfzl4aay.jpg

  • 改动形态以后
    214800aw328yew24bj7wqz.jpg

  • 改动形态前后
    214800l84ix4u49u4i03hx.jpg


免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则