Windows / Maccss
環境依賴html
編碼工具/編輯器vue
小程序端工具node
# 全局安裝taro的命令行工具
npm install @tarojs/cli -g
# 出現👽 Taro v x.x.x 證實安裝成功
taro
複製代碼
# taro init 以後,見下圖1,init成功以後,見下圖2
taro init project
cd project
# 安裝依賴,避免init 項目過程當中依賴安裝不完整的狀況
npm install
複製代碼
-[注意]:若是你npm install 出現錯誤,別慌,按照以下操做走一波。react
rm -rf node_modules package-lock.json
npm install
複製代碼
圖1: 圖2:
git
.es6
├── babel.config.js # Babel 配置
├── .eslintrc.js # ESLint 配置
├── config # 編譯配置目錄
│ ├── dev.js # 開發模式配置
│ ├── index.js # 默認配置
│ └── prod.js # 生產模式配置
├── package.json # 項目的核心。它包含名稱、描述和版本之類的信息,以及運行、開發以及有選擇地將項目發佈到 NPM 所需的信息。
├── dist # 打包目錄
├── project.config.json # 小程序項目配置
├── src # 源碼目錄
│ ├── app.config.js # 全局配置
│ ├── app.less # 全局 樣式
│ ├── app.js # 入口組件
│ ├── index.html # H5 入口 HTML
│ └── pages # 頁面
│ └── index
│ ├── index.config.js # 頁面配置
│ ├── index.less # 頁面 CSS
│ └── index.jsx # 頁面組件,若是是 Vue 項目,此文件爲index.vue
複製代碼
.github
H5web
cd your project
npm run dev:h5
複製代碼
weapp 微信小程序npm
npm run dev:weapp
複製代碼
見下圖,證實服務啓動成功
tt 頭條小程序/抖音小程序
npm run dev:tt
複製代碼
見下圖,證實服務啓動成功
百度 百度小程序
npm run dev:swan
複製代碼
見下圖,證實服務啓動成功
如
注意若是你不知道對應端的小程序應該啓動什麼命令,以下:
npm run dev:tt # 頭條
npm run dev:weapp # 微信
npm run dev:swan # 百度
npm run dev:alipy # 支付寶
npm run dev:qq # QQ
npm run dev:jd # 京東
npm run dev:h5 # H5
npm run dev:quickapp # 快應用
複製代碼
import React, { Component } from 'react'
import { View, Text } from '@tarojs/components'
export default class Index extends Component {
constructor() {
super();
this.state = {
defaultValue: 'Hello World!!'
};
}
componentWillMount() {}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
render() {
const { defaultValue } = this.state
return (
<View className='home'> {/* 文本渲染 */} <Text style={{ color: 'red' }}>{defaultValue}</Text> </View>
);
}
}
// 如上代碼,便可在對應端的服務中,看到 Hello Worl 的文字展現。就如上我介紹的各端展現效果中的hello world 字樣
// 好奇的同窗可能注意到了,咱們的變量用{}包裹起來了,是的。react的JSX語法是能夠在裏面進行事件綁定,表達變量,實現簡單 JS 邏輯等,也就是說在 JS 裏寫 HTML。
// **而變量、簡單 JS 邏輯都是須要用 {} 包裹起來** 這裏是關鍵。
複製代碼
import React, { Component } from 'react'
import { View, Text } from '@tarojs/components'
const testData = [
{
label: '星期一',
id: 1,
value: 'Monday',
},
{
label: '星期二',
id: 2,
value: 'Tuesday',
},
{
label: '星期三',
id: 3,
value: 'Wednesday',
},
];
export default class Index extends Component {
constructor() {
super();
}
componentWillMount() {}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
render() {
return (
<View className='home'> {testData.map((item) => { return ( <View key={item.id} className='home__week'> <Text>{item.label}</Text> <Text>{item.value}</Text> </View> ); })} </View>
);
}
}
// 由於這裏渲染的是數組,因此試圖層你會看到testData數組變量每個object的label、value值
複製代碼
import React, { Component } from 'react'
import { View, Text } from '@tarojs/components'
export default class Index extends Component {
constructor() {
super();
this.state = {
defaultValue: 'Hello World!!',
number: 0,
}
}
componentWillMount() {}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
handleClick1 = () => {
this.setState({
defaultValue: "一、二、三、變了!!!",
});
console.log("你如今點擊我了");
};
render() {
const { defaultValue, number } = this.state;
return (
<View className='home'> {/* 文本渲染 */} <Text style={{ color: "red" }}>{defaultValue}</Text> {/* 綁定點擊事件,寫法1 */} <View className='home__btn'> <Text onClick={this.handleClick1} className='home__btn--txt'> 點擊我改變defaultValue </Text> </View> {/* 綁定點擊事件,寫法2,不推薦,根據實際場景,例如error從新請求數據 onClick={()=>this.fetchData()} */} <View onClick={() => { // 操做state自身最好使用以下方式 this.setState((prevState) => { return { number: prevState.number + 1, }; }); }} style={styles.viewStyle} > <Text style={styles.viewStyleFont}>{number}</Text> </View> </View>
);
}
}
// 一、這裏介紹了兩種綁定點擊事件的方法,以後你能夠在任意你須要事件行爲的元素上進行onClick的綁定。
// 二、你看到這個代碼塊咱們多了兩個區域的代碼,一個是咱們聲明瞭一個變量,這是用於你給標籤元素綁定樣式的一種行爲,能夠用一個根級變量託管各個小變量,而後在想要添加樣式的標籤上如掛載就行。例如:
// <Text style={styles.viewStyleFont}>{number}</Text>。Text就是你要掛載到的標籤。viewStyleFont就是要添加的樣式變量。
const styles = {
viewStyle: {
background: 'pink',
color: '#fff'
},
viewStyleFont: {
fontSize: '14px'
}
}
複製代碼
// 這也是常規一種樣式處理方案,給標籤綁定class,而後找到對應的class去寫對應的樣式。
// 若是你有疑問,記得css 是這麼綁定的如 <div class="container"></div>
// 由於HTML 的 class 屬性是 Javascript 的保留字,因此須要寫成 className。哈哈哈。
// 因此根據如上代碼,className='home',我在root標籤給定一個className 的變量,
// 接下來包含在綁定這個home的標籤內的任意元素,都是他的子孫元素。那這裏呢咱們使用BEM命名規範。
// BEM命名規範 : https://juejin.cn/post/6844903672162304013
// __block 用來進行與子元素的鏈接。
// & 符號表示對父選擇器home的引用
// less 是css的一種預處理器擴展語言。方便咱們快速開發。
// 關於 less 和 & :https://www.jianshu.com/p/127b0974cfc3
// 關於less 的瞭解 :https://less.bootcss.com/
.home {
padding: 16Px;
// 以下這種寫法會編譯輸出成 .home__week
&__week {
display: flex;
justify-content: space-between;
font-size: 16Px;
}
// & 就是引用了父親綁定的class:home。以下這種寫法會編譯輸出成 .home__btn,這就是和咱們綁定的home__btn同樣啦。
&__btn {
width: 163Px;
height: 38Px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, rgba(242,20,12,1) 0%,rgba(242,39,12,1) 70%,rgba(242,77,12,1) 100%);
border-radius: 26Px;
&--txt {
font-size: 14Px;
color: rgba(255,255,255,1);
}
}
}
複製代碼
- 上述操做修改了state,簡單說下,不要直接修改state,例如,this.state.defaultValue = '一、二、3',由於此種方式不會從新渲染組件,不走render,若是安裝了elsint校驗,會過不去的。
- State的更新多是異步的,立馬執行以後,是沒法直接獲取到最新的 state ,React 其實會維護着一個 state 的更新隊列,每次調用 setState 都會先把當前修改的 state 推動這個隊列,在最後,React 會對這個隊列進行合併處理,而後去執行回調。根據最終的合併結果再去走下面的流程(更新虛擬dom,觸發渲染真實dom),react不是真實意義上的異步,taro是。
- state使用的三種方式
第一種
this.setState({ number: this.state.number + 1 }) // this.state.number 0
第二種
this.setState({ number: this.state.number + 1 },() => {
console.log("callback: ", this.state.number); // 2
});
第三種
this.setState(prevState => {
console.log("func: " + prevState.number); // 1
return {
number: prevState.number + 1
};
},()=>{
console.log('now '+ this.state.number) // 2
});
複製代碼
import React, { Component } from 'react';
import { View, Text } from '@tarojs/components';
export default class Child extends Component {
static defaultProps = {
langName: '',
enName: '',
onNameEvent: () => {},
};
constructor() {
super();
}
componentWillMount() {}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
emitNameEvent = (langName) => {
this.props.onNameEvent(langName);
};
// 界面描述
render() {
const { langName, enName } = this.props;
return (
<View style={styles.container}> <Text onClick={() => this.emitNameEvent(langName)}>{langName}</Text> <Text>{enName}</Text> </View>
);
}
}
const styles = {
container: {
width: '100%',
display: 'flex',
justifyContent: 'space-between',
},
};
複製代碼
import React, { Component } from 'react'
import { View, Text } from '@tarojs/components'
import Child from './components/test';
const testData = [
{
label: '星期一',
id: 1,
value: 'Monday',
},
{
label: '星期二',
id: 2,
value: 'Tuesday',
},
{
label: '星期三',
id: 3,
value: 'Wednesday',
},
];
export default class Index extends Component {
constructor() {
super();
}
componentWillMount() {}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
render() {
return (
<View className='home'> {testData.map((item) => { return ( <View key={item.id} className='home__week'> <Child langName={item.label} enName={item.value} onNameEvent={(name) => { console.log('拿到子組件的name',name) }} /> </View> ); })} </View>
);
}
}
複製代碼
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentWillMount() {}
componentDidMount() {}
componentWillUpdate(nextProps, nextState) {}
componentWillReceiveProps(nextProps) {}
componentDidUpdate(prevProps, prevState) {}
shouldComponentUpdate(nextProps, nextState) {}
componentWillUnmount() {}
render() {
return (
<View> <Text>Hello, world!</Text> <Text>如今的時間是 {this.state.date.toLocaleTimeString()}.</Text> </View>
);
}
}
複製代碼
上述組件中生命週期一一簡單敘述
初始化階段
掛載階段
更新階段
shouldComponentUpdate,比較當前組件的this.props/this.state和傳入的nextProps/nextState,是否須要重渲染的判斷,未改變返回false,當前組件更新中止。若組件的state與props發生改變則返回true,當前組件的更新開始。能夠減小組件沒必要要的渲染,優化組件性能。渲染優化。
componentWillReceiveProps,傳入的參數(nextProps)爲父組件傳遞給子組件的新props,經過本做用域中的this.props與傳過來的nextProps進行比較來得出是否要從新調用render進行渲染,能夠有效減小無效渲染次數,並提升週期的開發效率。你能夠在這裏根據新的 props 來執行一些相關的操做,例如某些功能初始化等
componentWillUpdate,當組件在進行render更新以前的預渲染函數。[基本不用]
componentDidUpdate,當組件完成更新時,會執行的函數,傳入兩個參數是 prevProps 、prevState,爲組件更新前的props和state,須要重點注意的是,更新階段內不準使用setState方法進行state值的修改,不然會引發render的循環重渲染。 [基本不用]
卸載階段
{/* 例如文本渲染,設置文字顏色 */}
<Text style={{ color: 'red' }}>{defaultValue}</Text>
複製代碼
{/* 綁定點擊事件,寫法2 */}
<View style={styles.viewStyle}>
<Text style={styles.viewStyleFont}>{number}</Text>
</View>
const styles = {
viewStyle: {
background: 'pink',
color: '#fff',
},
viewStyleFont: {
fontSize: '14px',
},
};
複製代碼
{/* 手寫按鈕 */}
<View className='home__btn'>
<Text onClick={this.handleClick1} className='home__btn--txt'> 點擊我改變Hello World </Text>
</View>
複製代碼
.home {
padding: 16Px;
&__btn {
width: 163Px;
height: 38Px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, rgba(242,20,12,1) 0%,rgba(242,39,12,1) 70%,rgba(242,77,12,1) 100%);
border-radius: 26Px;
&--txt {
font-size: 14Px;
color: rgba(255,255,255,1);
}
}
}
複製代碼
[React、Vue兩大框架根據實際使用技術棧學習]