Ошибка типа throw throw для неопределенного объекта до того, как троичный сможет проверить, не является ли объект неопределенным - PullRequest
0 голосов
/ 25 октября 2018

LONG STORY SHORT: Я бы хотел, чтобы он загрузил объект во вложенный массив, ЕСЛИ он не равен неопределенному, но реагирует на него throws typeError

У меня есть этот компонент, который принимает реквизиты от родительского компонента.По сути, у меня есть массив, содержащий информацию чата, и когда я пытаюсь получить к нему доступ в этом дочернем компоненте, я получаю очень странное поведение.

Например, если я консольный журнал (props.conversations), я получаю свой массив, который выглядиткак это: разговоры [{host, members [{username}], log [{author, content, timestamp}]}].

если я консольный журнал (props.conversations [0]) не получит первыйобъект в этом массиве.Но если я консоль журнала (props.conversations [0] .log) я получаю неопределенным.И это хорошо, потому что в начале состояние не будет определяться или содержать что-либо, поэтому я поместил троичный оператор, как показано ниже в коде props.conversations [props.index] .log [0] == null?но все, что я получаю, это TypeError: Невозможно прочитать свойство 'log' undefined в троичной функции.

Может быть, я не правильно понимаю это или, может быть, как реагируют функции?Опять же, я хотел бы, чтобы он загружал объект во вложенный массив, ЕСЛИ он не равен undefined.

Высоко ценю помощь.Самая важная часть - это друзья.Я только показываю другие, чтобы показать состояние, передаваемое вниз.

function Friends(props) {

console.log(props.conversations[props.index]);

return (
    <div className="friend">
        <img className="friendavatar" src={require("./static/bobby.jpg")}></img>
        <div className="friendname">{props.username}</div>
        <span className="iswatchingtitle"> is watching <strong>{props.watching}</strong></span>
        <div className="friendchat" onClick={props.togglechat}>
           {props.conversations[props.index].log[0] == null ?
            <div>undefined</div>
            :
            <div>defined!</div>
           }
        </div>
    </div>
)
}

социальный компонент

function Social(props) {

return (
    <div>
        <div className="userquickdash row">
            <div className="usernamedash">{props.username}</div>
            <div className="logout"><a href="/users/logout" onClick={props.fetchlogout}>logout</a></div>
        </div>
        <div>
            <form className="search-form-flex" method="GET" action="/search">
                <input className="user-search" id="search" type="search" placeholder=" Search users..." name="usersearch"></input>
            </form>
        </div>
        <div className='friendchatcontainer' refs='friendchatcontainer'>
            {/* Append friends from social bar state (props.friends). For each friend return appropriate object info to build Friends div using Friends(props) function above. */}
            {props.friends.map(function(friend, index) {
                // Shortens length of video title if length of string is over 48.
                let friendWatching = function friendWatchingLengthSubstring() {
                    if (friend.watching.length > 57) {
                        let friendWatching = friend.watching.substring(0, 54) + '...';
                        return friendWatching;
                    } else {
                        friendWatching = friend.watching;
                        return friendWatching;
                    }
                };

                return (
                    <Friends username={friend.username}
                    watching={friendWatching()}
                    key={index}
                    index={index}
                    togglechat={props.togglechat}
                    conversations={props.conversations}
                    />
                )
            })}
        </div>
    </div>
)
}

социальный компонент

class Socialbar extends Component {
constructor(props) {
    super(props);


    this.state = { isLoggedIn: (cookies.get('loggedIn')), 
                  sidebarximgSrc: sidebarcloseimg, 
                  sidebarStatus: 'open', 
                  username: cookies.get('loggedIn'),
                  friends: friends,
                  users: {},
                  conversations: [],
                 };


}

// function to run when mongodb gets information that state has changed.
// test if the current state is equal to new object array.
// then do something.
appendFriends() {

}

componentDidMount() {
   if (this.state.sidebarStatus === 'open') {
       document.getElementsByClassName('maindash')[0].classList.add('maindashwide');
       this.openSideBar();
   } else {
       document.getElementsByClassName('maindash')[0].classList.remove('maindashwide');
       this.closeSideBar();
   }
    // check for user logged in cookie, if true fetch users.
    if (this.state.isLoggedIn) {
        this.fetchUsers();
    }

    this.getFriendConversations();
};

getFriendConversations() {
    // build loop function that updates state for conversations based on length of friends array in state. 
    var conversationsArray = this.state.conversations;

    for (var i = 0; i < friends.length; i++) {


    console.log(aconversationbetweenfriends[i]);
    conversationsArray.push(aconversationbetweenfriends[i]);
}

this.setState({conversations: conversationsArray});
}

render() {
    let sidebar;

    const isLoggedIn = this.state.isLoggedIn;
    if (!isLoggedIn) {
        sidebar = <Login />
    } else {
        sidebar = <Social username={this.state.username} friends={this.state.friends} fetchlogout={this.fetchlogout} togglechat={this.togglechat} conversations={this.state.conversations}  />
    }

 return (
        <div>
            <div className="sidebar sidebar-open" ref="sidebar">
                <div className="sidebarcontainer">
                    {sidebar}
                </div>
            </div>
            <div className="sidebarx sidebarxopen" ref="sidebarx" onClick={this.toggleSideBar}>
                <img className="sidebaropenimg" src={this.state.sidebarximgSrc} ref='sidebarximg'></img>
            </div>
        </div>
    );
} 
};

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы должны сравнить для неопределенного, как это:

{props.conversations[props.index].log[0] === undefined ?
        <div>undefined</div>
        :
        <div>defined!</div>
       }

Кроме того, вы можете перейти по ссылке ниже для примера запуска песочницы.

Ссылка песочницы, например, чтобы показать, какВы должны проверить неопределенность

0 голосов
/ 25 октября 2018

Привет, прежде всего, проверьте ваш {props.index} распечатайте это значение.если это правильно, попробуйте это.

 {
       props.conversations[props.index] ?
        props.conversations[props.index].log[0] ? <div>defined!</div>:<div>Undefined</div> 
       : 
        <div>Undefined</div>
  }

Это проверит, определен ли props.conversations [props.index] тогда, а затем только попытается обработать props.conversations [props.index] .log [0].Поэтому вы не получите TypeError: Невозможно прочитать свойство 'log' из undefined в троичной функции.

0 голосов
/ 25 октября 2018

Неплохо получить доступ к элементу непосредственно перед проверкой.

Используйте что-то вроде этого:

props.conversations[props.index] && props.conversations[props.index].log[0]

Совет: деструктуризация объекта пользователя и реквизиты по умолчанию.

...