学习React JSX 语法

为什么要使用React框架?

起初的前端,一个页面可能要引用多个css样式文件或者js脚本文件,但是由于样式名称或函数名可能存在重复,而且样式和函数都是全局变量,所以容易造成混乱,不利于页面修改也不利于代码复用。
react框架通过用JS来写HTML和CSS实现代码组件化,消除了全局变量带来的危害,方便修改和代码复用。

react install

  1. 首先确保电脑上安装了node。
    可以用如下方法测试是否安装了node(windows环境):
  • 打开cmd,输入node -v,如果显示了相关版本信息,说明node已安装
  • 在cmd中输入npm -v,如果显示了相关版本信息,说明npm已安装。
  1. 安装react
npm install -g create-react-app

3.新建react项目

create-react-app my-app
  1. 查看react是否正确安装
cd my-app
npm start

ES6语法

  • class 是ES6定义的关键词。
  • 当要引用多个类或者函数时,除第一个类或函数,其余都写在花括号内
  • extends 是ES6定义 继承 的关键词,后面跟着要继承的父类。
  • export 表示导出,单个函数/类在文件尾部加上 export default(默认导出)+ 类/函数名;多个函数或类导出时,要用export {class1,class2}导出,否则类/函数 不可被其他文件调用。
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h1 className="App-title">Hello React</h1>
        </header>
        <p className="App-intro">
          To get started, edit <code>src/App.js</code> and save to reload.
        </p>
      </div>
    );
  }
}

export default App;

什么是JSX?

JSX是JavaScript Xhtml 的简写。
Xhtml 相较于其他html,语法要求更为严格。
例如:所有标签必须闭合,单个闭合标签尾部必须写/。

<h1> </h1>
<img />

JSX语法

  • 所有标签必须闭合,单个闭合标签尾部必须写/ ;
  • 由于html关键词与JSX关键词冲突,在JSX代码中用className代替class,htmlFor代替for ;
  • JSX代码执行规则:遇见<>时,用html语法解析,遇见{ }用js语法解析 ;
  • render表示渲染,render是Component下的方法,此处是重定义render方法 ;
  • return 后的内容必须写在小括号内,括号里的内容必须是一个闭合的标签 。
  • 在JSX中我们通常是通过 {} 的方式插入值,但是设置style属性需要{{ }} ,否则系统会报错。
import classes form './myCss.css'
{/*JSX 中的注释方式*/}

{/*style属性必须使用 {{}} */}
<div style={{width: 20px; height=30px}}>
    { props.text }
</div>

{/*html class属性*/}
<div className="myClass"></div>

{/*html input标签, JSX中所有的标签都必须有闭标签*/}
<input type="text" />

{/*html label标签 */}
<label htmlFor="name" class="mayName"></label>

{/*调用.css 文件中的css属性, mycss 为css文件中的类*/}
<div className={classes['mycss']}></div>

react语法

  • React 要求class 类名首字母必须大写,否则无法渲染 ;
  • Component 是React的组件,所有自定义的React组件必须继承Component ;

部署React应用到python-django生产环境

  1. 运行 npm run build 将会在 build 文件夹中创建一个编译好的应用,
  2. build文件夹下的static下的cssjs添加进django工程文件中的statics文件夹下;
  3. build文件夹下的index.htm文件复制到templates文件夹中;
  4. 在django views文件夹下创建新的视图函数并添加一个链接 ;
  5. 在django settings文件下添加STATIC_URL = '/statics/' 设置读取静态文件的路径。

在React中添加样式

方法一:导入css文件

  1. import CSS文件 import "./App.css";
  2. 在React代码中设置标签属性来添加样式,属性名为className ,属性值为css文件中对应的样式名。

Html 块级元素和行内元素
区别:默认在一行内显示的元素是行内元素,默认分行显示的元素是块级元素
转换:在CSS样式中,通过 display属性进行转换,属性值block表示块级元素,属性值inline表示行内元素

import "./App.css";

class App extends Component{
    render(){
        return(
            <div>
                <h1>Hello {"Word"}</h1>
                <form>
                    <input type="text" placeholder="name" className="button"/>
                    <input type="password" placeholder="password"  className="button"/>
                    <input type="button" value="submit" className="button"/>
                </form>
            </div>
        )
    }
}

方法二:内联样式

  1. 在类/函数的方法内,创建一个新的dict变量,以key-value的形式保存样式。
  2. 此dict变量名,必须用驼峰式命名,不能用连字符。
  3. value值必须为字符串;
  4. 在同个类/函数的方法的return括号内,直接在<>内引用样式style={button}
class App extends Component{
    render(){
        let button = {
            display:"block",
            border:"solid 2px red",
            color:"white",
            backgroundColor:"grey",
        }
        return(
            <div>
                <h1>Hello {"Word"}</h1>
                <form>
                    <input type="text" placeholder="name" style={button} />
                    <input type="password" placeholder="password"  style={button}/>
                    <input type="button" value="submit" style={button}/>
                </form>
            </div>
        )
    }
}

方法三:CSS in JS

  1. 安装styled-components:
    在cmd内输入npm install styled-components
    (必须是局部安装,如果加上-g 全局安装npm install -g styled-components,就无法找到这个模块)
  2. import sytled import styled from "styled-components"
  3. 在类/函数的方法内,用关键字const直接定义一个常量,常量名首字母必须大写,等号右边styled.+ 标签名 + ```(一对反引号),在反引号内直接写css样式代码
  4. 在类/函数的return括号内,直接以常量名作为组件来使用,可以在组件内增加属性(组件其实就是用JS写的自定义标签)。
import styled from "styled-components"

class App extends Component{
    render(){
        const Input = styled.input`
            display:block;
            border:solid 2px red;
            color:red;
            background-color:yellow
            input:hover{background-color:blue}
        `
        let button = {
            display:"block",
            border:"solid 2px red",
            color:"white",
            backgroundColor:"grey",
        }
        return(
            <div>
                <h1>Hello {"Word"}</h1>
                <form>
                    <input type="text" placeholder="name" style={button} />
                    <input type="password" placeholder="password"  style={button}/>
                    <Input type="number" />
                    <input type="button" value="submit" style={button}/>
                </form>
            </div>
        )
    }

组件react和setState

  • 在react中,属性值不能修改,要在类的顶部初始化this.state的值
constructor () {  //函数constructor()类同于django里的def __init__():{}
        super()  //The super keyword is used to access and call functions on an object's parent.
        this.state = { isLiked: false }  //以dict形式初始化this.state值。this类同于django里的self
    }
  • 方法中,当要修改this.state属性值时,要用关键字 this.setState
handleClickOnLikeButton () {
        this.setState({
            isLiked: !this.state.isLiked // ‘!’表示逻辑“非”
        })
    }
  • 三元表达式
function three(x){
    if (x){
       return 1
    }else{
        return 2
    }
}

等同于

function four(x){
    return x?1:2
}

React中props的用法?

  • 在React中,需要改变的值用this.state来定义;不需要改变,只需要传参的值用this.props来定义。
  • “this."是在ES6语法类中的定义,相当于python中类中的“self”
  • 调用React组件时,要给组件传参
 <Ctable hea={hea} colu={colu} />

如何在React里跨文件调用组件?

  1. 在文件顶部 import 要调用的组件及来自的文件。
    例如:import Ctable from "./static/css_table.js"
  2. 在组件内引用外部组件时,只需要以< componentName 参数名称={具体数据} />格式就可以
    例如:<Ctable hea={hea} colu={colu} />
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容