react基础

  1. 基本语法

    • ReactDOM.render():渲染虚拟dom,注意大小写

    • map方法生成列表arr .map(function(value){})

    • 可以直接插入变量

      var arr = [
        <h1>Hello world!</h1>,
        <h2>React is awesome</h2>,
      ];
      ReactDOM.render(
        <div>{arr}</div>,
        document.getElementById('example')
      );
      
    • 处理子节点:``React.Children.map,获取子节点this.props.children`

    • 通过propTypes定义属性类型React.PropTypes.string.isRequired ,定义初始属性:

      getDefaultProps : function () {
          return {
            title : 'Hello World'
          };
        },
      
    • 获取真实节点this.refs.name

    • 初始化state getInitialState

    • 组件的生命周期,前三个周期都有两种状态will did

      • Mounting: 载入

      • Updating:正在被重新渲染

      • Unmounting:已移除真实DOM

      • componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用

      • shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用

        component-lifecycle
        component-lifecycle
  `
 class App extends React.Component {
 // Mounting:
 componentWillMount() {
   // 1. 這是第一次 render 前,更新 state 的最後機會:
   this.setState({ ageText: this.props.age + '歲' });
 }

 // Mounting:
 componentDidMount() {
   // 1. 如果你要操作實際的 DOM 元素:
   $('#app').hide();

   // 2. 如果你要請求 AJAX,或是設置 timer:
   $.ajax({ ... });
 }

 // Updating:
 componentWillReceiveProps(nextProps) {
   // 1. 如果你要根據新的 props 做一些運算:
   this.setState({ ageText: nextProps.age + '歲' });
 }

 // Updating:
 shouldComponentUpdate(nextProps, nextState) {
   // 1. 如果你想調校元件效能,不想要做沒有意義的 re-render,
   //    如下方只有在 id 不相同的情況下再 render 的話:
   return nextProps.id !== this.props.id;
 }

 // Updating:
 componentWillUpdate(nextProps, nextState) {
   // 1. 這是第 N 次 render 前,最後被調用的方法,
   //    通常可以拿來做 log
 }

 // Updating:
 componentDidUpdate(prevProps, prevState) {
   // 1. 如果你要操作更新後實際的 DOM 元素:
   $('#app').hide();
 }

 // Unmounting:
 componentWillUnmount() {
   // 1. 如果該元件消滅,也需要移除不必要的 AJAX 請求的話:
   xhr.abort();

   // 2. 如果你要移除不必要的傾聽事件:
   store.removeChangeListener(...);
 }
 }
  1. react建立组件的三种方式

    • 使用es6的类

      class TodoList extends React.Component{
        render(){
          
        }
      }
      
    • 使用createClass

      const TodoList = React.createClass({
        render(){
          return (<div>todolist</div>)
        }
      })
      
    • 使用无状态函数

      const TodoList = function(){
        return <div>todoapp</div>
      }
      

  2. 通过属性props传递参数给子组件{title,name,...rest}=this.props ,还可以这样添加属性

    const props = {
      name:'nico',
      age:18
    }
    render(){
      return <div {...props} ></div>
    }
    //使用function时时通过参数获得的
    function Todo(props){
      
    }
    const Todo=(props)=>(<div></div>)
    const Todo =({name,age})=>(<div><div>)
    
    //相关知识点
    //组合对象
    const firstName = 'Jason';
    const lastName = 'Chung';
    const others = {
      sex: 'male',
      age: 27
    };
    const user = {firstName,lastname,...others}
    
  3. 防止类型错误,可以给组件设置属性类型

    Todo.propTypes={
      title:React.PropTypes.string,
      age:React.PropTypes.number
    }
    
  4. 动态添加列表

    render(){
      <div>
      {this.props.todos.map((todo)=>{
        <li>{todo.name}</li>
      })}
      </div>
    }
    
  5. 过滤器filter

    arr.filter((state)=>{
      return number>9
    })
    
  6. css module

    • :local 为局部变量,默认
    • :global 全局变量
    • 组合class composes:classname
  7. this.props.children 表示组件所有的子节点

  8. fetch获取数据

    fetch('./todos.json')                         // 1. 使用 fetch 回傳的是 promise 物件
        .then((response) => response.json())        // 2. 解析 response 資料,將它轉成 js 物件
        .then((todos) => this.setState({ todos })); // 3. 更新元件 state
    
    //使用方法
    const promise = new Promise((resolve, reject) => {
      // resolve 用來傳遞非同步的成功結果,例如:AJAX 最後取得的資料或一秒後定義的值
      // reject 用來傳遞非同步的錯誤結果
      setTimeout(() => resolve('async'), 1000);
    });
    
    promise
      .then((res) => console.log(res))   // 透過 promise.then 可以先定義非同步成功後,要執行什麼
      .catch((err) => console.log(err)); // 透過 promise.catch 可以先定義非同步錯誤後,要執行什麼
    
    • 相关api:

      const url = '/login';
      const options = {
        method: 'POST',
        headers: {}
      };
      
      fetch(url, options)           // 使用 fetch 調用 AJAX 回傳 promise 物件
        .then((res) => res.json());
      
  9. redux流程

img
img
let listeners = []
// 1. Redux 中只會有一個狀態樹,統一存放所有業務資料
let state

// 2. 每當使用者觸發事件,調用 store.dispatch(action)
function dispatch(action) {
  // 3. 根據 reducer 取得最新的狀態
  state = reducer(state, action)
  // 4. 通知所有傾聽器 store 的狀態已改變
  listeners.slice().forEach(l => l())
}

// 5. 當 view 知道 Store 狀態改變,呼叫 getter API 取得最新狀態
function getState() {
  return state
}

// 6. 讓 view 註冊狀態改變的傾聽器
function subscribe(listener) {
  listeners.push(listener)
  // 7. 回傳 unsubscribe 函數
  return () => listeners.filter((l) => l !== listener)
}
  1. 注意apply应用

    function foo(x, y, z) {}
    const args = [1,2,3];
    
    // 下面两句效果相同
    foo.apply(null, args);
    foo(...args);
    
  2. generator

    app.model({
      namespace:'todos',
      effects:{
        *addRemote({payload:todo},{put,call}){
          yield call(addTodo.todo);
      yield put({type:'add',payload:tod})
        }
      }
    })
    
  3. img
    img

14.当有多个属性时classnames
import classnames from 'classnames'; const App = (props) => { const cls = classnames({ btn: true, btnLarge: props.type === 'submit', btnSmall: props.type === 'edit', }); return <div className={ cls } />; }

  1. dva的model
      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;
            }
          });
        },
      },
      };
    

dva的简单使用

使用dva-cli:

​ 生成路由:dva g route routerName

​ 生成model:dva g model modelName

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

推荐阅读更多精彩内容