const DELAY = 1000 let count = 0 count = count + 1
const user = 'world' console.log(`hello ${user}`) // 多行 const content = ` hello ${user} thanks for you ${user} ` console.log(content)
function logActivity(activity = 'skiing'){ console.log(activity) } logActivity() ;// skiing
[1, 2, 3].map(x => x + 1) // [2,3,4] // 等同於 [1, 2, 3].map((function(x) { return x + 1; }).bind(this));
import dva from 'dva' import {connect} from 'dva' import * as service from './services' export default App export class App extends Component{}
// 對象 const people = {name:'kk',age:12} const { name , age } = people console.log(`${name}:${age}`) // 數組 const arr = [1,2] const [foo,bar] = arr console.log(foo) // 函數 const add = (state,{payload}) => { return state.concat(payload) } // alias別名 const plus = (state,{payload:todo}) => { return state.concat(todo) }
const n = 'kk' const a = 8 const u = {n , a} // 定義對象的方法時,可省略去function app.model({ reducers:{ add(){} // <=> add: function() {} }, effects:{ *addRemote() {} // <=> addRemote: function() {} } })
// 組裝數組 const array = ['add'] // [...array,'remove'] // 獲取部分項 function directions(first,...rest){ console.log(rest) } console.log(directions('a','b','c')) // 代替apply function fun(x,y,z){ console.log(y) } const args = [1,2,3] fun.apply(null,args) // 等同於 fun(...args) // 合成新的object const old = { a:1 } const change = { b:2 } const ret = {...old , ...change}
fetch('/api/todos') .then(res => res.json()) .then(data => ({data})) .catch(err => ({err})) // 定義promise const delay = (timeout) => { return new Promise(resolve => { setTimeout(resolve,timeout) }) } delay(1000).then(_ => { console.log('executed') })
/* 概述:dva 的 effects 是經過 generator 組織的。Generator 返回的是迭代器,經過 yield 關鍵字實現暫停功能。 這是一個典型的 dva effect,經過 yield 把異步邏輯經過同步的方式組織起來。 */ app.model({ namespace:'todos', effects:{ *addRemove({payload:todo},{put,call}){ yield call(addTodo,todo) yield put({type:'add',payload:todo}) } } })
————————————————-重要內容—————————————————react
函數git
類es6
const attrs = { href : 'http://exm.org', target:'_blank' } <a {...attrs}>hello</a>
// 概念:因爲js是弱類型語言,聲明propTypes對props進行校驗是有必要的 function App (props){ return <div>{props.name}</div> } App.propTypes = { name:React.PropTypes.string.isRequired }
.title { color: red; } :global(.title) { color: green; }
//而後在引用的時候: <App className={styles.title} /> // red <App className="title" /> // green
/* 概念:在一些複雜的場景中,一個元素可能對應多個 className,而每一個 className 又基於一些條件來決定是否出現。 這時,classnames 這個庫就很是有用。 */ import classnames from 'classnames' const App = (props) => { const cls = (props) => { btn : true, btnLarge:props.type === 'submit', btnSmall:props.type === 'edit' } return <div classNames={cls}> } //這樣傳入不一樣的type給App組件,就會返回不一樣的className組合 <App type='submit'/> <App type='edit'/>
// 增刪改 以todo爲例 app.model({ namespace:'todos', state:[], reducers:{ add(state,{payload:todo}){ return state.concat(todo) }, remove(state,{payload:id}){ return state.filter(todo => todo.id !== id) }, update(state,{payload:updatedTodo}){ return state.map(todo=>{ if(todo.id === updatedTodo.id){ return {...todo,...updatedTodo} }else{ return todo } }) } } })
// 嵌套數據的增刪改 app1.model({ namespace:'app', state:{ todos:[], loading:false, }, reducers:{ add(state,{payload:todo}){ const todos = state.todos.concat(todo) return {...state,todos} } } })
app2.model({
namespace:'todos', effects:{ *addRemove({payload:todo},{put,call}){ yield call (addTodo,todo) yield put({type:'add',payload:todo}) } } })
yield put({ type: 'todos/add', payload: 'Learn Dva' }); // 7.7.2 call 用於調用異步邏輯 支持promise const result = yield call(fetch, '/todos'); // 7.7.3 select 從state中獲取數據 const todos = yield select(state => state.todos)
app.model({
effects: {
*addRemote() {
try { // Your Code Here } catch(e) { console.log(e.message); } }, }, });
fetch學習地址: https://github.com/github/fetchgithub
import request from '../util/request' //get request('/api/todos') // post request ('/api/todos',{ methods:'post', body:JSON.stringify({a:1}) })
app.model({
subscriptions:{
setup({dispatch,history}){
history.listen(({pathname})=>{
if(pathname === 'users'){ dispatch({ type:'users/fetch' }) } }) } } })
import {routerRedux} from 'dva/router' // inside effects yield put(routerRedux.push('/logout')) // outside effects dispatch(routerRedux.push('/logout')) // with query routerRedux.push({ pathname:'/logout', query:{ page:2, } })
import createLogger from 'redux-logger' const app = dva ({ onAction:createLogger() // onAction支持數組,可同時傳入多箇中間件 }) // history 切換history爲browserHistory import {browserHistory} from 'dva/router' const ap = dva({ history:browserHistory }) //去除 hashHistory 下的 _k 查詢參數 import { useRouterHistory } from 'dva/router'; import { createHashHistory } from 'history'; const app2 = dva({ history: useRouterHistory(createHashHistory)({ queryKey: false }), });
$ npm i dva-cli -g # 安裝dva-cli $ dva new myapp # 建立項目 $ cd myapp $ npm start # 啓動項目