1、动态加载Tree结构时,默认选中以及默认展开功能问题
动态数据默认选中能选中,但是默认展开功能会失效
解决方案 :
react/** *@loop方法 官网中方法 *@this.props.selectedKeys 默认选中数据 string[] *@this.props.expandedKeys 默认展开数据 string[] */ render(){ return( <div> { this.props.treeData && this.props.treeData.length > 0 ? <Tree className="draggable-tree" defaultSelectedKeys={this.props.selectedKeys} defaultExpandedKeys={this.props.expandedKeys} blockNode> {loop(this.props.treeData)} </Tree > : '暂无数据' } <div> ) }
需要在 config.js文件进行开启配置
reactplugins :[ ['umi-plugins-react',{ dva : true }] ]
在umi中,约定在src/models文件夹中定义model进行数据处理交互
以代码为例,使用dva进行分层
1、page页
reactimport React from 'react' import { connect } from 'dva' //model层[namespace]唯一值,提供给page页面找到指定的model数据 const namespace = 'spanModel'; /** * 第一种写法 * [connect中参数解析] * @val 作用:将page层与model层进行连接,并将数据绑定到this.props * @dispatch 作用:调用model层effects中方法 */ @connect((val) => { return { spanText : val[namespace].spanText,//spanText是mnodel中定义的值 } },(dispatch) =>{ return { OnChange : (val) =>{ dispatch({ type : `${namespace}/OnChange`,//调用namespace =spanModel的model中OnChange方法 payload : val //传值 }); } } }) class DvaPage extends React.Component{ render(){ return( <div> <span>{this.props.spanText}</span> <button onClick = {this.props.OnChange.bind('嘿嘿')}>点击更改值</button> </div> //.bind("嘿嘿"),自定义方法传值方式之一 ) } } /* * 第二种写法 * 适用于添加了hooks */ const dvaState = ()=>{ return { spanText : val[namespace].spanText, } } const DvaPage =(props) =>{ const OnChange = (val) =>{ const { dispatch } = props; dispatch({ type : `${namespace}/OnChange`, payload : val }); } return( <div> <span>{this.props.spanText}</span> <button onClick = {this.props.OnChange.bind('嘿嘿')}>点击更改值</button> </div> ) } export default connect(dvaState)(DvaPage)
2、model页面
reactexport default { namespace: 'spanText', state: { spanText: '',//树结构数组 }, reducers: { /** * @odlstate 当前state * @res effects中put过来的值 */ setSpanText: (odlstate, res) => { if (res.data) { //给state中的spanText更新值 //也可以直接返回res.data,会自动复制(不推荐) return { ...odlstate, spanText: res.data}; } } }, effects: { /** * 写法一 * @payload page页面传入的参数 * @call 请求使用 * @put 提交数据到reducers进行数据更新 */ OnChange({ payload }, { call, put }) { yield put({ type: 'setSpanText', data: payload, }); // Lo }, //写法二 //带星号是属于异步进行数据操作:如请求操作 *OnChange({ payload }, { call, put }){} } }
还不熟练 简单写写以后完善
reactimport React ,{ useState } from 'react' import { connect } from 'dva' //不能适用类的写法 const namespace = 'spanModel'; const DvaPage =(props) =>{ /** * @text 初始值 * @setText 更改值得方法 */ const {text,setText} = useState('嘿嘿'); //可以规定值得类型 useState<string>('嘿嘿') return( <div> <span>{`显示这个文字${text}`}</span> <button onClick={() => setText('哈哈')}>更改值</button> </div> ) } export default connect(null)(DvaPage)
1、树结构详解(切勿多次定义属性名。以免树结构层次变深)
reducers中返回的命名是state树最底下的名字
react//reducers.js import * as Audit from './auditTypes'; //treeData 最终取值属性名 //treeReducer 可在合并时更改 const treeReducer = (state = [], action) => { switch(action.type) { case Audit.AUDIT_TREE: return { ...state, treeData: action.treeData } default: return state } } export default treeReducer;
reactimport { combineReducers } from 'redux'; import treeReducer from './auditReducers'; //treeReducer在此处还能更改树结构(合并处) const auditReducers = combineReducers({ treeReducer, //treeData : treeReducer 将treeReducer重命名为treeData }) export default auditReducers;
合并后最上层属性为合并时定义的属性名;如:auditReducers
当取值时取值依次为:树结构.合并名.单个reducers名.定义名;
如:
react//业务.js(取值操作) const mapStateToProps = (state, ownProps) => { return { treeData: state.auditReducers.treeReducer.treeData } }
react对函数式组件优化
本文作者:还是夸张一点
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!