前端小白在项目中遇到的问题

问题一.使用ra的field,一列只能展示一个字段,那如果在一列展示后端传来的两个字段呢?

解决:使用单独的组件,在该组件中通过antd的<col>来解决

<Col>
           <p></p>
          <Button></Button>
</Col>

问题二:后端传来的字段是1,转化成对应的汉字

const Choice = {
    0: '作业',
    1: '完成' ,
    2: '未完成'
}

// 取值  value = 1  就是对象取值的问题。。。。。
<p>>Choice[value]</p>

问题三:点击一个按钮去调接口访问,使用ant design的抽屉,显示列表,怎么做到 1 2 3 都在表里,如果结果只有3,只显示3,其他为空。然后实现,有记录为编辑,没记录是保存。编辑表使用antd的编辑行的实现。

解决:
1.建立一个空数组res=[],先遍历[top1,top2,top3],
2.如果reslut的length为0,那就创建一个对象,把它push进去res。
3.如果result的length不为0,建立一个空对象item,遍历result,item=reslut[i], 将有的记录保存起来。
3.1.如果item=null,那就push进去剩下的没有的
3.2.否则push进去现有的。

4.返回该数组,将table中的dataresource替换掉

      const tableData = (result) => {
            let resultData = [];
            let markName = ['1', '2', '3'];
            for ( let i = 0; i < markName.length; i++ ) {
               let name = markName[i];
               if (result.length === 0) {
                    resultData.push({
                        'age': undefined
                        'name': [name],
                        'id': undefined,
                    });
                } else {
                    let item = null;
                    for( let j = 0; j < result.length; j++ ) {
                        if (name === result[j].name) {
                            item = result[j];
                            break;
                        }
                    } 
                    if (item === null) {
                        resultData.push({
                         'age': undefined
                        'name': [name],
                        'id': undefined,
                            
                        });
                    } else {
                        resultData.push(item);
                        item = null;
                    }
                }   
            }           
            return resultData;         
        }

问题四:怎么实现没有记录的时候点击保存调新增接口,有的时候点击保存调编辑接口

    const save = ( record ) => {
            // 无id表示为保存
            if ( record.id === undefined ) {
                 add(record);  //新增
            } else {
                // 调编辑接口
            }
        };

问题五:table的编辑行,没有+折叠input框的demo,那么怎么结合折叠的状态发生变化,点编辑出现input,取消出现文本的形式?

解决:设置一个可编辑的状态,(编辑行demo中有),setEditing,判断editable是不是true,为true就是可编辑的,否则不可编辑。

 const [editingKey, setEditingKey] = useState('');
          // 判断是否编辑状态
         const isEditing = record => {
             return record.name === editingKey;
        };
        // 点击编辑时
         const edit = record => {
             setEditingKey(record.name);   // record.name === editingKey(setEditing设置的) 为true
         };
        // 展开事件
          const expand = ( record ) => {
            const editable = isEditing(record);
           return  editable ? (
            <Input/>
            )
            : <p></p>
        }

问题六 select的onchange事件既传id又传value(后端需要的字段)的情况,id怎么一层一层的传,在select1中点了某个option,结果要在select2中渲染。

//select 第二级  dataid先在reducer中存一一下,每次通过onchange传最新的reducer
//finderrorbyid 传来的id为第一层中level1的 item.id
  const findErrorById = ( id ) => {
            let res = [];
            for(let i = 0; i< data.level2.length; i++) {
                if ( data.level2[i].id === id ) {
                    res = data.level2[i].values;
                } 
            }
            return res;   // 第二层中要显示的数据
        }

// select第二层 对finderrorbyid的结果进行展示
   <Select    
   value={error_types.name}
   onChange={e => onChange("name")(e)}
   >
    {mapDataToOptions(findErrorById(Number(dataId)).map(item => (
      { value: item.value, text: item.name, id: item.id }
      ))       
    )}
  </Select> 

// 展示方法
function mapDataToOptions(data) {
    return data.map(item => (
      <Select.Option title={item.text} value={item.value+'?'+Number(item.id)}> 
        {item.text}
      </Select.Option>
    ));
  };
// onchange怎么传id和value   id进行保存 value对应传给key所对应的字段

```javascript
//e = id?value
 const onChange = (key) => e => {   // onchange(key)(e)
            let value = e.split('?')[0];
            let id = e.split('?')[1];
            dispatch({
                type: SAVE_ID,
                payload: id,
            })
            dispatch({
              type: CHANGE_LIST,
              payload: [key]: value, // "name":value
            }); 
        };
     //但是这样有问题,传过去的字段可能是英文,但是你要展示中文,其中的原因就是<select value={error_types.name}> 中传的字段和select  option中value字段不一致导致的,即使你传了[name]='zhangsan',也显示不了张三。
     // 解决,value传item.text+id, 传text中文给后端
     // 其他:未想到

问题七:table的分页

简单思路:在useeffect中发送dispatch调用getlist的接口,传需要的参数例如:id和num 每页的数量,和page当前页。
之后在table中的pagination中的onchange事件中也调用getlist接口传num、page、id等。

问题八:

checkbox可选,每次选时调接口,然后如果选了就展示出来,问题是,可以根据后端传的0/1进行展示,但是此时的checkbox选不了。页面刷新后,显示已选。
解决:

// 1.首先用创建一个state 其中table中的datasource指的就是datasource
 const [dataSource, setDataSource] = useState([]);  // 建一个初始值
    useEffect(() => { 
        setDataSource(list);   // 设为后端传来的data并监听它的变化
    }, [list]);
//2.点击checkbox时  checked是否选中后根据后端传来的is_check来判断
 <Checkbox checked={record.is_check} onChange={e => handleChange(e)(record, index)}/>
 
 //3.change事件
 const handleChange = (e) => (record, changeIndex) => {
       const tmpList = dataSource.map(({ is_check, ...item }, index) => { //遍历后端给的list
        return {
                check_flag: changeIndex === index ? e.target.checked : is_check, //如果点击的index不等于list的index,就是没点击的其他行,让其他行按照传来的is_check进行展示,其他的变成e.target.checked 可以为true,也可以为false
                ...item
            }
        });
        setDataSource(tmpList);  //变成修改后的datasource
        // 接口
        checkApi({
            id: record.id,
            is_check: e.target.checked === true ? 1 : 0  //给后端传0或者1
        }).then(()=>{})
     }

问题九(x)

: 点击一个一个button 弹出一个框,如果点了OK,实现页面跳转,自己是使用一个状态设为false,如果点了ok就让它变为true,如果取消就是false,不让它调,但是我会根据true和false来对a标签的href设置,如果为false,那就是空,如果为true就是url,这样的问题是你还得重新再点一下a标签。
解决:

// 路由携带参数
history.push({
              pathname: '/cs/transfer/evaluating',
              query: {
                       'id': 1,
                        'name': 2
                   }
                });

问题十

:后端给了一个导出xsl的接口,前端调了之后,需要做什么特殊的操作吗,还是只是调接口?
解决

//问题1:导出不调接口:解决:因为一直从缓存中获取了。传参时加个时间戳
//问题2: 导出的字节流,如果能转换成json对象,那么它里面会包含msg或者status一些错误信息的提示
  //                  如果不能转换成json对象,那就是可以成功的转化成文件的形式
  // 解决:
  if (status === 200) {
                // 导出 
                let blob = new Blob([response.data], {type: "application/vnd.ms-excel"});        
                //做一个副本
                let blob1 = new Blob([response.data], {type: "application/vnd.ms-excel"});
                //转成text
                var reader = new FileReader();
                reader.readAsText(blob, 'utf-8');
                reader.onload = function (e) {
                    try {
                        const data = JSON.parse(reader.result);  // try捕获一下是否能转换成json对象,如果可以取出msg,弹出信息。
                        message.error(data.msg); 
                    } catch (e) {
                    // 如果不可以,说明可以转换成文件直接导出文件就行
                        let objectUrl = URL.createObjectURL(blob1); 
                        // 文件名字
                        let fileName = response.headers['content-disposition'].split(';')[1].split('=')[1];
                        // 文件地址
                        const link = document.createElement('a');
                        link.download = fileName;
                        link.href = objectUrl;
                        link.click()
                        message.success('导出成功');
                    } 
                } 
            }else {
                message.error('导出失败');
            }




// 导出
exportExcel() {
    return axios({
        method: method,
        url: url,
        data: data,
        responseType: 'blob'
    }).then(response => {
            const { status, msg } = response;
            if (status === 200) {
               
                // 导出 
                let blob = new Blob([response.data], {type: "application/vnd.ms-excel"}); 
                let objectUrl = URL.createObjectURL(blob); 
                // 有名字的导出
                //let fileName = response.headers['content-disposition'].split(';')[1].split('=')[1];
                let fileName = "测试.xls"
                // 文件地址
                const link = document.createElement('a')
                link.download = fileName
                link.href = objectUrl
                link.click()
                message.success('导出成功');
            } else {
                message.error('导出失败');
            }
        });.catch(data => {
        console.log('导出失败');
    })
}

问题十一: antd的日期传值的问题,moment

// 在submit传参数时
 // 参数:
    start_date: start_date.format("YYYY-MM-DD"),
  start_time:sampleParams.start_time.format("HH:mm:ss"),
//给默认值 在reducer中通过 moment('00:00:00', 'HH:mm:ss')

问题十二:axios的get的params和post的data的区别
知识点:

  1. produce
  2. axios
  3. moment
  4. treeselect
  5. cors

收获:

  1. 尽量不要用href,用路由跳转或者link
  2. 提交git时的规范: update:modify 信息 in 文件
  3. 编辑回填,点编辑把现在的record中的该字段通过,draft[字段]=record.字段 传过去,保存起来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值