Vue刚转React的那些事儿

背景: 3月份离职了,之后入职新公司,第一个任务是react + ts + node项目;由于没有react开发经验就先过了一遍文档,在开始敲代码的时候总是会忘记语法,然后就做了个react 基础语法和注意事项 相关的文档,加一些和vue使用的区别,有react经验的小伙伴就不需要浪费时间往下看啦~~

那么就开始吧~

  1. 变量作为属性值及模版中嵌入表达式
<!--react-->
 <span type={user.type}>{user.name}</span> 
 <!--vue-->
 <span :type="user.type">{{user.name}}</span> 
  1. 单向数据流
    react 通过setState来修改,方便定位问题;
    所有 React 组件都必须像纯函数一样保护它们的 props 不被更改
    vue也是单向数据流不过也还是可以通过黑科技改变props的

  2. 模版嵌套
    组件的嵌套设计,复杂大型功能自下而上,小型功能自上而下,方便处理和测试

  3. react 的 state
    组件私有属性,用与子组件共享,用于可变状态(mutable state);
    react如果子组件共用且均需要修改state时要将state提升到公共父级去,修改需使用setState来处理

  4. 最小state
    通过父级props传进来;随着时间的推移保持不变;能根据其他props和state技术出来;
    以上3种情况都不应该另用新state

  5. 组件不使用state时可写成函数形式

    function LogoutButton(props) {
      return (
        <button onClick={props.onClick}>
          Logout
        </button>
      );
    }
    <!--组件使用-->
    <LogoutButton />
    
  6. 反向数据流
    子组件通知父组件修改state,通过调用回调函数来解决,将父组件函数传入子组件来进行处理;不同于vue是子组件emit事件,父级接收到emit来执行相关函数

  7. 阻止默认事件
    不能通过返回false 的方式阻止默认行为。你必须显式的使用 preventDefault

        <!--无法阻止-->
        <a href="#" onclick="console.log('The link was clicked.'); return false">
          Click me
        </a>
    
    <!--正确做法-->
    function ActionLink() {
      function handleClick(e) {
        e.preventDefault();
        console.log('The link was clicked.');
      }
    
      return (
        <a href="#" onClick={handleClick}>
          Click me
        </a>
      );
    }
    
  8. 组件名开头必须大写
    React 会将以小写字母开头的组件视为原生 DOM 标签。 <div> 代表 HTML 的 div 标签,而 <Welcome />则代表一个组件,并且需在作用域内使用 Welcome。规范详见深入JSX

  9. style

  10. 在模板上直接使用要用‘双括号’

  11. 定义style对象添加

 <!--直接在模版添加-->
  <div
    className="board-row"
    style={{color: 'red'}}
  >喂喂,testtest</div>
  <!--style变量-->
  const devClass = {color:red};
  <div style={ devClass, ..., ....}></div>
  
  <!--如果是font-size等有中线的要改为驼峰-->
   <div style={{fontSize:'14px'}} key={item.title}>
  1. class
    在react中class是保留字因此以className替换,其他差异详见react属性差异

    function Square(props) {
      return (
        <button className="square" onClick={props.onClick}>
          {props.value}
        </button>
      );
    }
    
  2. 对比于 vue slot

    1. react 子组件通过props.children可以实现;比起slot props可以传递任何东西
        function FancyBorder(props) {
          return (
            <div>
            <!--如果父级传入children将会被覆盖-->
              {props.children}
            </div>
          );
        }
        
        function WelcomeDialog() {
          return (
          <!--此处children不会被接收,会被子组件所覆盖-->
            <FancyBorder color="blue" children={11}>
              <h1 className="Dialog-title">
                Welcome
              </h1>
            </FancyBorder>
          );
        }
        
        ReactDOM.render(
          <WelcomeDialog />,
          document.getElementById('root')
        );
    
    1. 父组件直接将组件传入及子组件props[any]获取
  3. fragment
    render return时需要包裹dom元素;
    React 中的一个常见模式是一个组件返回多个元素。Fragments 允许你将子列表分组,而无需向 DOM 添加额外节点

    render() {
      return (
        <React.Fragment>
          <ChildA />
          <ChildB />
          <ChildC />
        </React.Fragment>
      );
    }
    

    你可以使用一种新的,且更简短的语法来声明 Fragments;可以像使用任何其他元素一样使用 <> </>,除了它不支持 key 或属性

    class Columns extends React.Component {
      render() {
        return (
          <>
            <td>Hello</td>
            <td>World</td>
          </>
        );
      }
    }
    
  1. 参数传递,详见Context

    1. context:设计目的是为了共享那些对于一个组件树而言是“全局”的数据;主要应用场景在于很多不同层级的组件需要访问同样一些的数据;
       // Context 可以让我们无须明确地传遍每一个组件,就能将值深入传递进组件树。
       // 为当前的 theme 创建一个 context(“light”为默认值)。
       const ThemeContext = React.createContext('light');
       
       class App extends React.Component {
         render() {
           // 使用一个 Provider 来将当前的 theme 传递给以下的组件树。
           // 无论多深,任何组件都能读取这个值。
           // 在这个例子中,我们将 “dark” 作为当前的值传递下去。
           return (
             <ThemeContext.Provider value="dark">
               <Toolbar />
             </ThemeContext.Provider>
           );
         }
       }
       
       // 中间的组件再也不必指明往下传递 theme 了。
       function Toolbar(props) {
         return (
           <div>
             <ThemedButton />
           </div>
         );
       }
       
       class ThemedButton extends React.Component {
         // 指定 contextType 读取当前的 theme context。
         // React 会往上找到最近的 theme Provider,然后使用它的值。
         // 在这个例子中,当前的 theme 值为 “dark”。
         static contextType = ThemeContext;
         render() {
           return <Button theme={this.context} />;
         }
       }
    
    1. 组件组合(将组件传入)
    <!--原-->
      <Page user={user} avatarSize={avatarSize} />
      // ... 渲染出 ...
      <PageLayout user={user} avatarSize={avatarSize} />
      // ... 渲染出 ...
      <NavigationBar user={user} avatarSize={avatarSize} />
      // ... 渲染出 ...
      <Link href={user.permalink}>
        <Avatar user={user} size={avatarSize} />
      </Link>
      
    <!--改:只有最顶部的 Page 组件需要知道 Link 和 Avatar 组件是如何使用 user 和 avatarSize 的。-->
      function Page(props) {
        const user = props.user;
        const userLink = (
          <Link href={user.permalink}>
            <Avatar user={user} size={props.avatarSize} />
          </Link>
        );
        return <PageLayout userLink={userLink} />;
      }
      
      // 现在,我们有这样的组件:
      <Page user={user} avatarSize={avatarSize} />
      // ... 渲染出 ...
      <PageLayout userLink={...} />
      // ... 渲染出 ...
      <NavigationBar userLink={...} />
      // ... 渲染出 ...
      {props.userLink}
    
  2. 错误边界

部分 UI 的 JavaScript 错误不应该导致整个应用崩溃,为了解决这个问题,React 16 引入了该概念;
错误边界是一种 React 组件,这种组件可以捕获并打印发生在其子组件树任何位置的 JavaScript 错误,并且它会渲染出备用 UI,而不是渲染那些崩溃了的子组件树。错误边界在渲染期间、生命周期方法和整个组件树的构造函数中捕获错误
  1. 组件首字母必须大写
import React from 'react';
import { PhotoStory, VideoStory } from './stories';

const components = {
  photo: PhotoStory,
  video: VideoStory
};

function Story(props) {
  // 错误!!!!JSX 类型不能是一个表达式。
  return <components[props.storyType] story={props.story} />;
  // 正确!!!!JSX 类型可以是大写字母开头的变量。
  const SpecificStory = components[props.storyType];
  return <SpecificStory story={props.story} />;
}
  1. 传递子集动态变量(直接传就行) 在此基础上改
  render() {
    const celsius = scale === 'f' ? tryConvert(temperature, toCelsius) : temperature;
    const fahrenheit = scale === 'c' ? tryConvert(temperature, toFahrenheit) : temperature;
    const tmp = [
      {scale: 'c', key: celsius},
      {scale: 'f', key: fahrenheit},
    ]
    return (
      <div>
        {
          tmp.map(item => {
            return  <TemperatureInput
                scale={item.scale}
                temperature={item.key}
                onTemperatureChange={this.handelCommon}
              />
           })
        }
      </div>
    );
  }
  1. 传递当前event
 <!--react-->
 <input
   type="text"
   placeholder="Search..."
   value={this.props.filterText}
   onChange={(e)=>this.handleFilterTextChange('sth', e)}
 />
  <!--vue-->
  <searchInput
    v-model="params.nameKey"
    placeholder="搜索名称"
    icon="android-close"
    @search="searchData"
    @clear="afterChange('nameKey', $event)"
  ></searchInput>
  1. Portal 弹窗🌰
    Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案。
    典型用例是当父组件有 overflow: hidden 或 z-index 样式时,但你需要子组件能够在视觉上“跳出”其容器。例如,对话框、悬浮卡以及提示框

19.componentWillReceiveProps
使用时最好比较两个props一面陷入死循环,不停更新组件参考

等等。。。

参考:

  1. https://juejin.im/post/5c2de832f265da6172659b45
  2. https://juejin.im/post/5b8b56e3f265da434c1f5f76

结语:
有咩有小伙伴能提供个更恰当的文章名字哇。。。嘤嘤。。起名废


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

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,422评论 1 33
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,810评论 1 18
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 1,005评论 0 1
  • HTML模版 之后出现的React代码嵌套入模版中。 1. Hello world 这段代码将一个一级标题插入到指...
    ryanho84阅读 6,221评论 0 9
  • 目前,react组件有三种写法,分别是es5的createClass写法,es6的class写法,以及statel...
    ZoomFunc阅读 1,618评论 0 1