react項目創建完整過程

1、安裝腳手架 npm install -g create-react-app / cnpm install -g create-react-app

2、創建項目 create-react-app 項目名稱(create-react-app --version 查看版本號)

3.安裝react-router-dom依賴

3.src下一般創建page,components,router文件夾

4.路由的引入

在router文件下創建router.js文件

//引入react jsx寫法的必須

import React from 'react';

//引入需要用到的頁面組件

import Home from '../pages/home';

import About from '../pages/about';

//引入一些模塊

import { BrowserRouter as Router, Route} from "react-router-dom";

 

function router(){

return (

<Router>

<Route path="/home" component={Home} />

<Route path="/about" component={About} />

</Router>);

}

 

export default router;

此時,app.js要引入路由的加載,如下

import React, { Component } from 'react';

import Router from './router/router'

 

class App extends Component {

 

 

constructor(props){

 

super(props);

}

render() {

return (

<Router />

);

}

}

 

export default App;

其中index.js爲項目的入口文件

 

5.嵌套路由,例如在about路由上嵌套一個子路由other後,

router.js文件變爲

//引入react jsx寫法的必須

import React from 'react';

//引入需要用到的頁面組件

import Home from '../pages/home';

import About from '../pages/about';

import Other from '../pages/other';

//引入一些模塊

import { BrowserRouter as Router, Route} from "react-router-dom";

 

function router(){

return (

<Router>

<Route path="/home" component={Home} />

<Route path="/about" render={()=>(

<About>

<Route path="/about/other" component={Other} />

</About>

)}>

</Route>

</Router>);

}

 

export default router;

about.js文件變爲

//about.js

import React, { Component } from 'react';

 

export default class About extends Component {

render() {

return (

<h1>

歡迎,這裏是About

{this.props.children}

</h1>

)

}

}

other.js文件爲

//other.js

import React, { Component } from 'react';

 

export default class About extends Component {

render() {

return (

<div>

歡迎,這裏是About的子路由

</div>

)

}

}

注意事項

1/ render={()=>對象} 這裏的對象不需要大括號噢,如果你熟悉箭頭語法的話,那麼應該不用我多說

2/ 擁有子路由的路由不能添加 exact屬性,不然會無法訪問到子組件

 

6.重定向

有時候,我們需要把 "/" 重定向到我們的主頁,這樣用戶直接輸入"www.***.com"就可以了,而不用輸入"www.***.com/home"。

//router.js //需要import一下Redirect import {Redirect} from "react-router-dom"; return ( <Router> <Route path="/home" component={Home} /> <Route path="/" render={ ()=> ( <Redirect to="/home"/>)}> </Route> </Router>); } export default router;

 

 

7.axios的引入,數據的定義,方法的定義,如下home.js

//home.js

import React, { Component } from 'react';

import {Link} from 'react-router-dom'

import axios from 'axios'

 

export default class Home extends Component {

constructor(props) {

super(props);

this.state = {

show: '這是定義數據'

}

}

componentDidMount() {

this.getData();

}

getData(){

axios.post('http://192.169.2.35/dsp/userThread/count', {

})

.then(function (response) {

console.log(response);

})

.catch(function (error) {

console.log(error);

});

}

display = () => {

this.setState({

show:'這是改變後的定義數據'

})

}

render() {

return (<h1>

歡迎,這裏是Home

{this.state.show}

<Link to="/about">about頁面</Link>

<button onClick={this.display}>改變數據</button>

</h1>)

}

}

 

8.父子組件傳值

父組件傳值給子組件,父組件通過state的方式傳值給子組件,而子組件通過props進行接收父組件傳過來的值

父組件about.js如下:

//about.js

import React, { Component } from 'react';

import Person from "./person"

 

export default class About extends Component {

constructor(props) {

super(props);

this.state = {

arr: [{

"userName": "fangMing", "text": "123333", "result": true

}, {

"userName": "zhangSan", "text": "345555", "result": false

}, {

"userName": "liSi", "text": "567777", "result": true

}, {

"userName": "wangWu", "text": "789999", "result": true

}]

}

}

render() {

return (

<h1>

歡迎,這裏是About

<Person aboutArr={this.state.arr}></Person>

{this.props.children}

</h1>

)

}

}

 

子組件person.js如下

 

 

 

import React from "react"

class ComentList extends React.Component {

constructor(props) {

super(props);

}

render() {

return (

<div className="list">

<ul>

{

this.props.aboutArr.map(item => { //這個地方通過this.props.arr接收到父組件傳過來的arr,然後在{}裏面進行js的循環

return (

<li key={item.userName}>

{item.userName} 評論是:{item.text}

</li>

)

})

}

</ul>

</div>

)

}

}

export default ComentList;

 

 

子組件給父組件傳值,子組件通過props定義對應值如pfn,,,父組件通過props.pfn接收子組件的傳過來的值

子組件person.js如下

import React from "react"

class ComentList extends React.Component {

constructor(props) {

super(props);

this.state = ({

childText: "this is child text"

})

}

clickFun(text) {

this.props.pfn(text)//這個地方把值傳遞給了props的事件當中

}

render() {

return (

<div className="list">

<ul>

{

this.props.aboutArr.map(item => { //這個地方通過this.props.arr接收到父組件傳過來的arr,然後在{}裏面進行js的循環

return (

<li key={item.userName}>

{item.userName} 評論是:{item.text}

</li>

)

})

}

</ul>

{/* 通過事件進行傳值,如果想得到event,可以在參數最後加一個event,

這個地方還是要強調,this,this,this */}

<button onClick={this.clickFun.bind(this, this.state.childText)}>

click me

</button>

</div>

)

}

}

export default ComentList;

 

 

父組件about.js如下

//about.js

import React, { Component } from 'react';

import Person from "./person"

 

export default class About extends Component {

constructor(props) {

super(props);

this.state = {

parentText: "this is parent text",

arr: [{

"userName": "fangMing", "text": "123333", "result": true

}, {

"userName": "zhangSan", "text": "345555", "result": false

}, {

"userName": "liSi", "text": "567777", "result": true

}, {

"userName": "wangWu", "text": "789999", "result": true

}]

}

}

fn(data) {

this.setState({

parentText: data //把父組件中的parentText替換爲子組件傳遞的值

},() =>{

console.log(this.state.parentText);//setState是異步操作,但是我們可以在它的回調函數裏面進行操作

});

 

}

render() {

return (

<h1>

歡迎,這裏是About

{/* 通過綁定事件進行值的運算,這個地方一定要記得.bind(this),

不然會報錯,切記切記,因爲通過事件傳遞的時候this的指向已經改變 */}

<Person aboutArr={this.state.arr} pfn={this.fn.bind(this)}></Person>

{this.props.children}

<p>

text is {this.state.parentText}

</p>

</h1>

)

}

}

 

 

 

第一全局axios請求

創建api的文件夾,

fetch.js如下

/**

* Created by Administrator on 2018/7/26.

*/

/* eslint-disable */

import axios from 'axios'

export function get(url, params = {}) {

if (Object.keys(params).length > 0) {

var queryString = '';

for (var key in params) {

queryString += '&' + key + '=' + params[key];

}

queryString = queryString.substring(1);

url += '?' + queryString;

}

return new Promise((resolve, reject) => {

axios({

method: 'get',

url:url,

}).then((response) => {

resolve(response.data);

}, err => {

reject(err);

})

.catch((error) => {

;

reject(error)

})

})

}

 

export function post(url, params = {}, config = {}) {

let contentType = 'application/x-www-form-urlencoded';

if (config && config.contentType) {

contentType = config.contentType;

}

let param = '';

for (let i in params) {

if (typeof params[i]=='string') {

// params[i] = params[i].replace('&','%26')

params[i] = encodeURIComponent(params[i]);

}

param += i + '=' + params[i] + '&';

}

if (param !== '') {

param = param.substring(0, param.length - 1);

}

return new Promise((resolve, reject) => {

axios({

method: 'post',

url: url,

contentType: contentType,

data: param,

}).then((response) => {

resolve(response.data);

}).catch((err) => {

console.log(err);

})

})

}

 

export function fetch(url, params = {}, config = {}) {

let method = 'post';

if (config && config.method) {

method = config.method;

}

let contentType = 'multipart/form-data';

if (config && config.contentType) {

contentType = config.contentType;

}

return new Promise((resolve, reject) => {

axios({

method: method,

url: url,

data: params,

contentType: contentType,

}).then((response) => {

resolve(response.data);

}, err => {

reject(err);

})

.catch((error) => {

reject(error)

})

})

}

 

export function postParams(url, params = {}, config = {}) {

let contentType = 'application/x-www-form-urlencoded';

if (config && config.contentType) {

contentType = config.contentType;

}

return new Promise((resolve, reject) => {

axios({

method: 'post',

url: url,

params: params,

dataType: 'json',

}).then((response ) => {

resolve(response.data);

}).catch((err) => {

console.log(err);

})

})

}

export function upload(url, params = {}) {

return new Promise((resolve, reject) => {

axios({

url: url,

data: params,

method: 'POST',

contentType: 'multipart/form-data',//text multipart/form-data

}).then(function (response) {

resolve(response.data);

},err => {

reject(err);

}).catch(function (error) {

reject(error)

});

})

}

export default {

get,

post,

fetch,

postParams,

upload

}

 

 

api.js如下

import {post} from './fetch'

 

export default {

homeGet(params) {

return post('接口請求地址',params)

}

}

在app.js下注冊如下

import React, { Component } from 'react';

import Router from './router/router'

import fetch from './api/api'

 

Component.prototype.$ajax = fetch;

class App extends Component {


 

constructor(props){

 

super(props);

this.state = {}

}

render() {

return (

<div>

<header>

這是公共頭部

</header>

<Router />

</div>

);

}

}

 

export default App;

 

home.js文件調用如下

//home.js

import React, { Component } from 'react';

import {Link} from 'react-router-dom'

 

export default class Home extends Component {

constructor(props) {

super(props);

this.state = {

show: '這是定義數據'

}

}

componentDidMount() {

this.getData();

}

getData(){

this.$ajax.homeGet().then(res =>{

console.log(res)

})

}

display = () => {

this.setState({

show:'這是改變後的定義數據'

})

}

render() {

return (<h1>

歡迎,這裏是Home

{this.state.show}

<Link to="/about">about頁面</Link>

<button onClick={this.display}>改變數據</button>

</h1>)

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章