React 爬坑记录(随时更新)

2019-08-01  本文已影响0人  E微客

简单背景

之前使用的是Vue,由于公司开发的新项目,UI 设计用到了内部组件库,仅支持 React 框架,所以转而学习 React,为避免之后重复遇到类似问题,因此做个简单的爬坑记录。

启动

    alias: {
        // Support React Native Web
        // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
        'react-native': 'react-native-web',
        '@': path.resolve(__dirname, '../src')
    },

问题与解决方式

import {lazy} from 'react';
const Home = lazy(() => import('@/views/Home'))
import createHistory from 'history/createBrowserHistory';
export const history = createHistory();
export const routes = [ ... ]

修改后代码:

import {lazy} from 'react';
const Home = lazy(() => import('@/views/Home'))
import { createBrowserHistory } from 'history';
export const history = createBrowserHistory();
export const routes = [ ... ]
import img from "@/assets/top_bg.png"
<img src={img} alt=""/>

第二种方式:require 直接引用

<img src={require('@/assets/top_bg.png')} alt=''/>

第三种方式:尝试在 utils 中封装公有方法,遍历 assets 下所有图片名称和路径,以 key-value 的方式存储,页面中调用方法取出对应图片即可,代码如下:

// 写在 utils 中的公共方法  (待优化)
getImgs = () => {
  const requireContext = require.context("@/assets", true, /^\.\/.*\.png$/);
  const projectImgs = requireContext.keys().map(requireContext)
  let imgs = {}
  for (let i = 0; i < projectImgs.length; i++) {
    const key = requireContext.keys()[i];
    let nameUrl = key.split('./')[1]
    let name = nameUrl.split('.')[0].replace(/\//g, "_")
    const element = projectImgs[i];
    imgs[name] = element
  }
  return imgs
}
// 在页面中引用:
import Utils from '@/utils/utils.js'
<img src={Utils.getImgs().top_bg} className='img-bg' alt=''/>

生成的数据格式如下图:


image.png

注意:图片路径必须是图中显示的 /static/media/***.*** 格式,否则和直接填入路径没有区别,都不会显示,该路径可以直接用 requireContext.keys().map(require.context("@/assets", true, /^\.\/.*\.png$/)) 来获取,后续数据处理因人而异,这里只是举个例子。

<li className={`menu-item ${menuIndex === index ? "menuActive" : null}`}>{item}</li>
function NewsList(props) {
  const newsArr = props.newsArr;
  const listItems = newsArr.map((item, index) =>
    <li className='news-item' key={index} style={{borderTop: (index === 0) ? 'none' : '1px solid #dee2f8'}}>
      <p className="news-content ellipse">{item.content}</p>
    </li>
  );
  return (
    <ul className="news-list">{listItems}</ul>
  );
}
// 父组件
<ImgsList contentArr={this.state.contentArr}  onMouseEn={this.handleMouseEnter}></ImgsList>
// 子组件
function ImgsList(props) {
  let contentArr = props.contentArr
  const listItems = contentArr.map((item, index) =>
    <li onMouseEnter={()=>{props.onMouseEn(index)}} key={index}></li>
  );
  return (
    <ul className="img-box">{listItems}</ul>
  );
}

注意:子组件中的事件必须使用 function_name={ () => {} } 这种函数的方式,否则默认都是普通函数,不会触发鼠标事件

<div>
      <p className='title'>条件渲染</p>
      { conidtion &&
          <p className='content' >{item.content}</p>
      }
</div>
function CardItem(props) {
  const listItems = cardArr.map((item, index) => {
    <li className="card-item" key={index}>
      <div className="text-box">
        <p className='title'>{item.title}</p>
        <p className='content'>{item.content}</p>
        <div className="btn-box">
          <Button type='primary' className='btm-button'>免费试用</Button>
          <Button type='primary' className='btm-button right-button'>文档介绍</Button>
        </div>
      </div>
    </li>
  })
  return (
    <ul className="card-box">{listItems}</ul>
  )
}

产生错误的原因是因为没有返回值,锁定第二行,把结尾的那个配套的大括号删掉,直接把内容作为返回值继续,解决

function CardItem(props) {
  const listItems = cardArr.map((item, index) => 
    <li className="card-item" key={index}>
      <div className="text-box">
        <p className='title'>{item.title}</p>
        <p className='content'>{item.content}</p>
        <div className="btn-box">
          <Button type='primary' className='btm-button'>免费试用</Button>
          <Button type='primary' className='btm-button right-button'>文档介绍</Button>
        </div>
      </div>
    </li>
  )
  return (
    <ul className="card-box">{listItems}</ul>
  )
}
上一篇 下一篇

猜你喜欢

热点阅读